Buddy Strings

easy string hash table

Problem

Given two strings s and goal, return true if you can swap two letters in s (at two distinct positions) so that the result equals goal, otherwise return false.

Inputs = "ab", goal = "ba"
Outputtrue
Swapping s[0] and s[1] gives "ba".

def buddy_strings(s, goal):
    if len(s) != len(goal):
        return False
    if s == goal:
        return len(set(s)) < len(s)
    diff = [i for i in range(len(s)) if s[i] != goal[i]]
    return len(diff) == 2 and \
        s[diff[0]] == goal[diff[1]] and s[diff[1]] == goal[diff[0]]
function buddyStrings(s, goal) {
  if (s.length !== goal.length) return false;
  if (s === goal) return new Set(s).size < s.length;
  const diff = [];
  for (let i = 0; i < s.length; i++)
    if (s[i] !== goal[i]) diff.push(i);
  return diff.length === 2 &&
    s[diff[0]] === goal[diff[1]] && s[diff[1]] === goal[diff[0]];
}
boolean buddyStrings(String s, String goal) {
    if (s.length() != goal.length()) return false;
    if (s.equals(goal)) {
        Set<Character> uniq = new HashSet<>();
        for (char c : s.toCharArray()) uniq.add(c);
        return uniq.size() < s.length();
    }
    List<Integer> diff = new ArrayList<>();
    for (int i = 0; i < s.length(); i++)
        if (s.charAt(i) != goal.charAt(i)) diff.add(i);
    return diff.size() == 2 &&
        s.charAt(diff.get(0)) == goal.charAt(diff.get(1)) &&
        s.charAt(diff.get(1)) == goal.charAt(diff.get(0));
}
bool buddyStrings(string s, string goal) {
    if (s.size() != goal.size()) return false;
    if (s == goal) {
        set<char> uniq(s.begin(), s.end());
        return uniq.size() < s.size();
    }
    vector<int> diff;
    for (int i = 0; i < (int)s.size(); i++)
        if (s[i] != goal[i]) diff.push_back(i);
    return diff.size() == 2 &&
        s[diff[0]] == goal[diff[1]] && s[diff[1]] == goal[diff[0]];
}
Time: O(n) Space: O(1)