原题指路
题目描述
给你长度相等的两个字符串 s1
和 s2
。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true
;否则,返回 false
。
解题思路
满足题目要求的情况只有以下两种:
s1
和s2
完全相同;s1
和s2
只有两个对应位置的元素不同。
所以循环遍历一次字符串进行判断即可。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
代码
class Solution
{
public:
bool areAlmostEqual(string s1, string s2)
{
int cnt = 0, index[3];
int len = s1.length();
for(int i = 0; i < len; i++)//循环找出字符串中不同的元素并记录下标
{
if(s1[i] != s2[i])
{
index[cnt] = i;
cnt++;
}
if(cnt > 2)//计数超过2就跳出
break;
}
//分情况讨论
if(!cnt)
return true;
if(cnt==2 && s1[index[0]] == s2[index[1]] && s1[index[1]] == s2[index[0]])
return true;
return false;
}
};