问题描述:
- 给你长度相等的两个字符串
s1
和 s2
。
- 一次字符串交换操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
- 如果对其中一个字符串执行最多一次字符串交换就可以使两个字符串相等,返回
true
;否则,返回 false
。
核心思路:
- 单次遍历即可。
- 用两个变量
idx1
和 idx2
维护两个索引,分别表示两个字符串中不一样的地方。【该两个变量初始化为 -1
】 - 不可以有两个以上不同位置,同时不可以只有一个不同位置。
- 遍历结束后还需要判断
nums1[idx1] == nums2[idx2] and nums1[idx2] == nums2[idx1]
是否交叉相等即可。
代码实现:
class Solution
{
public:
bool areAlmostEqual(string s1, string s2)
{
int idx1 = -1, idx2 = -1;
for(int i = 0; i < s1.size(); ++i)
{
if(s1[i] != s2[i])
{
if(idx1 == -1) idx1 = i;
else if(idx2 == -1) idx2 = i;
else return false;
}
}
if(idx1 == -1) return true;
if(idx2 == -1) return false;
return (s1[idx1] == s2[idx2] and s1[idx2] == s2[idx1]);
}
};