|
1 | 1 | class Solution {
|
2 |
| - public boolean buddyStrings(String A, String B) { |
3 |
| - if (A.length() != B.length()) { |
| 2 | + public boolean buddyStrings(String s, String goal) { |
| 3 | + if (s.length() != goal.length()) { |
4 | 4 | return false;
|
5 | 5 | }
|
6 |
| - char requiredChar = '-'; |
7 |
| - char mismatchChar = '-'; |
8 |
| - int[] counter = new int[26]; |
9 |
| - for (int i = 0; i < A.length(); i++) { |
10 |
| - if (A.charAt(i) != B.charAt(i)) { |
11 |
| - // Already done one swap hence cannot do any more swaps |
12 |
| - if (requiredChar == '_') { |
13 |
| - return false; |
| 6 | + if (s.equals(goal)) { |
| 7 | + Set<Character> set = new HashSet<>(); |
| 8 | + for (char c : s.toCharArray()) { |
| 9 | + if (set.contains(c)) { |
| 10 | + return true; |
14 | 11 | }
|
15 |
| - if (requiredChar == '-') { |
16 |
| - requiredChar = B.charAt(i); |
17 |
| - mismatchChar = A.charAt(i); |
| 12 | + set.add(c); |
| 13 | + } |
| 14 | + return false; |
| 15 | + } |
| 16 | + char[] mismatch = {'-', '-'}; |
| 17 | + for (int i = 0; i < s.length(); i++) { |
| 18 | + if (s.charAt(i) != goal.charAt(i)) { |
| 19 | + if (mismatch[0] == '|') { |
| 20 | + return false; |
18 | 21 | }
|
19 |
| - else { |
20 |
| - // Check if swap is possible from previous mismatch |
21 |
| - if (B.charAt(i) == mismatchChar && A.charAt(i) == requiredChar) { |
22 |
| - requiredChar = '_'; |
23 |
| - } |
24 |
| - else { |
25 |
| - return false; |
| 22 | + if (mismatch[0] == '-') { |
| 23 | + mismatch[0] = s.charAt(i); |
| 24 | + mismatch[1] = goal.charAt(i); |
| 25 | + } else { |
| 26 | + if (goal.charAt(i) == mismatch[0] && s.charAt(i) == mismatch[1]) { |
| 27 | + mismatch[0] = '|'; |
| 28 | + continue; |
26 | 29 | }
|
| 30 | + return false; |
27 | 31 | }
|
28 | 32 | }
|
29 |
| - else { |
30 |
| - counter[A.charAt(i) - 'a']++; |
31 |
| - } |
32 |
| - } |
33 |
| - if (mismatchChar != '-') { |
34 |
| - return requiredChar == '_'; |
35 |
| - } |
36 |
| - // Check if we have more than 1 occurrence of same characters. We can swap them to fulfil the condition |
37 |
| - for (int i = 0; i < 26; i++) { |
38 |
| - if (counter[i] > 1) { |
39 |
| - return true; |
40 |
| - } |
41 | 33 | }
|
42 |
| - return false; |
| 34 | + return mismatch[0] == '|'; |
43 | 35 | }
|
44 | 36 | }
|
0 commit comments