[leetcode] Buddy Strings

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吧。

这个题目没有什么太大的算法思想,考虑周全就好了。

猜你喜欢

转载自www.cnblogs.com/boris1221/p/9284641.html