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 <= 20000
0 <= B.length <= 20000
A
andB
consist 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]; } }