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
分析:题目给两个字符串,要求判断这两个字符串是否有且仅有两个字符颠倒了顺序。根据题目的意思,不难想到直接用字面上的方法就可以解决了。首先排除一下两个字符串长度不等这种特殊的情况。然后记录每个不相等的位置。最后有两个位置不同时,判断一下;当没有位置不同(两个字符串相等)时,判断一下是否有重复出现的字符,有的话就是true,这里用一个set记录出现的字符,比较set和A的长度,也是一个小技巧了。代码如下:
1 public boolean buddyStrings(String A, String B) { 2 if ( A.length() != B.length() ) return false; 3 int cur = 0; 4 List<Integer> list = new ArrayList<>(); 5 while ( cur < A.length() ){ 6 char c_A = A.charAt(cur); 7 char c_B = B.charAt(cur); 8 if ( c_A != c_B ) list.add(cur); 9 cur ++; 10 } 11 if ( list.size() == 2 ) { 12 return A.charAt(list.get(0)) == B.charAt(list.get(1)) && A.charAt(list.get(1)) == B.charAt(list.get(0)); 13 } 14 if ( list.size() == 0 ) { 15 Set<Character> set = new HashSet<>(); 16 for ( char c : A.toCharArray() ) set.add(c); 17 return set.size() != A.length(); 18 } 19 return false; 20 }
代码还有可以优化的地方,现在跑的结果时5ms。可以合并一些操作,估计优化后理想的结果应该是3、4ms吧。
这个题目没有什么太大的算法思想,考虑周全就好了。