给你一个字符串
s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的
s
。示例 1:
输入:s = "ab-cd" 输出:"dc-ba"示例 2:
输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba"示例 3:
输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"提示
1 <= s.length <= 100
s
仅由 ASCII 值在范围[33, 122]
的字符组成s
不含'\"'
或'\\'
解题思路
1.双指针法:左右端各设一个指针right和left,让left和right往中间走,如果是字母就交换,不是就跳过(使用循环保证二者一直是字母),注意交换后也要让指针移动,防止一直循环交换这两个字母
解题代码
class Solution {
public:bool isEnglishLetter(const char& ch){if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z'){return true;}return false;}string reverseOnlyLetters(string s) {int right = s.size() - 1;int left = 0;while (left < right){while(!isEnglishLetter(s[left]) && left < right)left++;while(!isEnglishLetter(s[right]) && left < right)right--;//不是的话已经++过了,现在二者必是英文字母if (left < right)swap(s[left], s[right]);left++;right--;}return s;}
};