Given two strings A and B of lowercase letters, return true if and only if we can swap two letters in A so that the result equals B.
Example 1:
Input:
A = "ab", B = "ba"
Output:
true
Example 2:
Input:
A = "ab", B = "ab"
Output:
false
Example 3:
Input:
A = "aa", B = "aa"
Output:
true
Example 4:
Input:
A = "aaaaaaabc", B = "aaaaaaacb"
Output:
true
Example 5:
Input:
A = "", B = "aa"
Output:
false
Note:
0 <= A.length <= 200000 <= B.length <= 20000AandBconsist only of lowercase letters.
Two cases:
- Exactly two chars are different, and two strings are same with these chars swapped
- Two strings are exactly same, the string has duplicate char, so we can pretend to have a swap.
class Solution {
/**
* @param String $A
* @param String $B
* @return Boolean
*/
function buddyStrings($A, $B) {
if(empty($A) || empty($B) || count($A) !== count($B)){
return false;
}
if($A == $B){
if(strlen(count_chars($A, 3)) != strlen($A)){
// Check is there're duplicate chars
return true;
}
}
$diff_a = [];
$diff_b = [];
for($i = 0; $i < strlen($A); $i ++){
if($A[$i] !== $B[$i]){
$diff_a[] = $A[$i];
$diff_b[] = $B[$i];
}
}
return count($diff_b) == 2
&& $diff_a[1] == $diff_b[0]
&& $diff_a[0] == $diff_b[1];
}
}