给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
示例 1:
输入:s = “ab-cd”
输出:“dc-ba”
来源:力扣(LeetCode)
双指针
双指针是一种解决问题的技巧或者思维方式,指在访问一个序列中的数据时使用两个指针进行扫描。
左右指针是初始将两个指针分别放在头和尾的位置,然后相向开始移动,直到两个指针相遇;
左右指针一般用在有序数组中,可以批量排除不符合要求的元素,将两重循环O(n2)的时间复杂度转化为一重循环O(n+m)的线性复杂度。
题目分析
使用双指针两边同时开始遍历,都找到了字母,则交换。
代码示例
class Solution {
public:
string reverseOnlyLetters(string s) {
int size = s.size();
int left = 0;
int right = size-1;
//左右指针还没有相遇
while (left < right)
{
//右边找一个字母
while (!isalpha(s[right]) && left < right)
{
right--;
}
//左边找一个字母
while (!isalpha(s[left]) && left < right)
{
left++;
}
//交换
swap(s[left], s[right]);
left++;
right--;
}
return s;
}
};