解题想法:
- 前后指针,前指针往后,后指针往前,都是字母时反转,不是字母是往里走,俩指针重合,遍历结束。没想法了
- 哈希表,int: string(字母),。。。。好像也需要用双指针。。。不好。
代码:
出错:
- 超时
class Solution { public: string reverseOnlyLetters(string s) { int n = s.size(); int l = 0, r = n-1; while (true) { while (l<r && !isalpha(s[l])) { l++; } while (l<r && isalpha(!s[r])) { //相等就不用判断了 r--; } if (l==r) { return s; } else { swap(s[l], s[r]); } } } };
原因:交换之后没加l++和r--,导致交换后再一次前面俩个依旧满足俩个while循环,程序一直停在这里就行交换,死循环。
- 修改之后依旧有问题,给出的答案和与其答案差别很大,仔细观察发现第三个while里,
!的位置写错了,修改之后直接报错,查了资料发现时数组下标出现了-1 - 又看了题解,重新发现了问题所在,对于跳出循环的条件,俺写了l==r,我仔细模拟过最后一次交换之后l、r之间有无字母的情况发现都是可以的,觉得没有问题,最后看了出现问题的案例,发现自己在模拟的时候,忘记了交换之后l++和r--。即第一次问题的遗留。。。。当最后一次交换的俩个字母相邻时,l++和r--,会导致l>r,前后指针会一直走,导致数组下表出现了-1的情况引起报错。
正答:
class Solution {
public:
string reverseOnlyLetters(string s) {
int n = s.size();
int l = 0, r = n-1;
while (true) {
while (l<r && !isalpha(s[l])) {
l++;
}
while (l<r && !isalpha(s[r])) { //相等就不用判断了
r--;
}
if (l>=r) {
return s;
} else {
swap(s[l], s[r]);
}
l++;
r--;
}
}
};