给你两个字符串 s
和 goal
,只要我们可以通过交换 s
中的两个字母得到与 goal
相等的结果,就返回 true
;否则返回 false
。
交换字母的定义是:取两个下标 i
和 j
(下标从 0
开始)且满足 i != j
,接着交换 s[i]
和 s[j]
处的字符。
- 例如,在
"abcd"
中交换下标0
和下标2
的元素可以生成"cbad"
。
示例 1:
输入:s = "ab", goal = "ba" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。
示例 2:
输入:s = "ab", goal = "ab" 输出:false 解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。
示例 3:
输入:s = "aa", goal = "aa" 输出:true 解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。
提示:
1 <= s.length, goal.length <= 2 * 104
s
和goal
由小写英文字母组成
Related Topics
遍历比较,简单
遍历比较
- 长度不同 ->
false
- 遍历字符串, 如果不同的的
char
超过两个 ->false
- 如果只有一个字符不同 ->
false
- 如果没有字符不同,看原字符串中有无重复的字符,则相同字符互相交换下可以和原来一样 ->
true
- 剩下有两个字符不同的情况,判断下
s
字符串中第一个不同字符和goal
第二个不同位置的是否一样,且s
字符串中第二个不同字符和goal
第二个不同位置的是否一样 如果符合 ->true
- 否则 ->
false
class Solution {
public boolean buddyStrings(String s, String goal) {
if (s.length() != goal.length()){
return false;
}
int[] diff = new int[]{-1,-1};
int idx = -1;
int diffCount = -1;
int[] charCount = new int[25];
while (++idx < s.length()){
charCount[s.charAt(idx)-'a']++;
if (s.charAt(idx) == goal.charAt(idx)){
continue;
}
if (diffCount == 1){
return false;
}
diff[++diffCount] = idx;
}
if (diffCount == 0){
return false;
}
if (diffCount == -1){
for (int i : charCount) {
if (i > 1){
return true;
}
}
return false;
}
return s.charAt(diff[0]) == goal.charAt(diff[1]) && s.charAt(diff[1]) == goal.charAt(diff[0]);
}
}
发表评论