前言
博主最近考试了,没时间刷难题了,刷一下简单题练练手,哈哈哈
题目要求:
整体思路
1、相等直接判断true。
2、遍历一遍单词,不同的字符对数目>2或者==1.必为错。
3、两个不同的时候,记录第一组不同,与第二组不同交叉比较,相同则可以,但凡一个不同,就是错。
具体代码
注:
1、他说了只交换一次,所以只能是有两个字符对不相等的情况才符合,剩下的都不行。
2、记录第一对,遇到第二对的时候,利用十字比较模拟交换过程,看交换后一不一致即可。
class Solution {
public:
bool areAlmostEqual(string s1, string s2) {
if (s1 == s2) {
return true;
}
int num = 0;//记录不相等对数
char temp1, temp2;
int n = s1.size();
for (int i = 0; i < n; i++) {
if (s1[i] != s2[i]) {
num++;
if (num == 1) {//记录第一对不同
temp1 = s1[i];
temp2 = s2[i];
}
else {
if (s1[i] != temp2 || s2[i] != temp1) {//和第二对不同交叉比对,只要有一个不相等都不行
return false;
}
}
}
if (num > 2) {
return false;
}
}
if (num == 1) {//不同的字符对数==1,错
return false;
}
return true;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
时间复杂度:O(n),遍历了一遍单词。