此题目较为简单,当涉及数组左右满足一定条件反转时,优先想到对撞指针的方法。
下面贴出代码,leetcode用时4ms
string reverseOnlyLetters(string s) {
int l = 0;
int r = s.size()-1;
while(l<r){
if(((s[l]>='A'&&s[l]<='Z')||(s[l]>='a'&&s[l]<='z'))&&((s[r]>='A'&&s[r]<='Z')||(s[r]>='a'&&s[r]<='z')))
swap(s[l++],s[r--]); //如果左右都是字母,则交换。
else if(!((s[l]>='A'&&s[l]<='Z')||(s[l]>='a'&&s[l]<='z'))&&((s[r]>='A'&&s[r]<='Z')||(s[r]>='a'&&s[r]<='z')))
l++; //左边不是字母,左边做加一操作。
else if(((s[l]>='A'&&s[l]<='Z')||(s[l]>='a'&&s[l]<='z'))&&!((s[r]>='A'&&s[r]<='Z')||(s[r]>='a'&&s[r]<='z')))
r--; //右边不是字母,右边做减一操作。
else //都不是字母,则左加一右减一。
{
l++;
r--;
}
}
return s;
}
主要算法实现部分,注释均已注明,请认真思考。