思路
通过一次遍历,记录不相同字符的个数diff
,以及两个不相同字符的位置x
与y
。
遍历过程中,如果发现不相同字符个数diff > 2
,则说明一定无法通过一次交换使得s2
变成s1
;同理,遍历结束后发现diff == 1
,显然也是无法通过交换使得两个字符串相等的。因此均返回false
。
遍历结束后:
diff == 0
的情况可以直接返回true
,diff == 2
的情况还需要额外进行一次判断:s1[x] == s2[y] && s2[x] == s1[y]
是否成立。
通过上述分析,代码如下:
class Solution {
public:
bool areAlmostEqual(string s1, string s2) {
int x = -1, y = -1; //不同字符的两个下标
int diff = 0; //不同字符的个数
auto n = s1.length();
for (auto i = 0; i < n; ++i) {
if (s1[i] != s2[i]){
diff++;
if (x == -1){
x = i;
} else if (y == -1){
y = i;
}
if (diff > 2){
return false;
}
}
}
if (diff == 0){
return true;
} else if (diff == 1) {
return false;
}
return s1[x] == s2[y] && s1[y] == s2[x];
}
};