解题思路
算法:双指针–左右指针
场景分类:对称操作类问题
思路:
左指针left指向字符串开头,右指针right指向字符串末尾
通过内层while循环,使得左指针left和右指针right指向的字符都是英文字母。随后交换两指针指向字符的位置
交换操作结束后,要让左右指针各移动一步,进而找下一组字母
最后,返回处理后的字符串
思考
1. 本题中双指针的作用?
本题要求将字符串中出现字母的位置反转
那么双指针的作用就是找到一组位置正好相反的字母
2. 为什么在交换操作完成后左右指针要各移动一步?
在交换操作完成后,左右指针指向的字符均是字母
下一步我们应该找到下一组位置相反的字母。但是现在左右指针已经指向了字母,如果不各移动一步,那么内层的两个while循环将永远不会工作。此时左右指针会一直停留在第一组字母的位置,一直进行交换操作。
这样就会导致左右指针无法找到下一组字母,反而陷入到了死循环,导致程序超时。
(当然,因为做该题时,距离上一次刷题过了好久时间,所以也有这个原因导致没有想到该问题)
代码
classSolution{public:boolisEnglish(charch){// 判断字符是否为英文字母if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))returntrue;returnfalse;}stringreverseOnlyLetters(string s){intleft=0,right=s.length()-1;// 左右指针while(left<right){// 让左右指针指向英文字母while(left<right&&!isEnglish(s[left]))left++;while(left<right&&!isEnglish(s[right]))right--;// 左右指针指向英文字母后,交换两字符swap(s[left],s[right]);// (第一次没想到,导致超时)// 左右指针各移动一步,找下一个英文字母left++;right--;}returns;}};收获
- 体会该题双指针的作用
- 在特定情况下,要有左右指针各移动一步的操作