1. 题目链接:917. 仅仅反转字母
2. 题目描述:
给你一个字符串
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
不含'\"'
或'\\'
3. 算法:
3.1 算法思路:
- 初始化两个指针,一个指向字符串的开头(begin),另一个指向字符串的结尾(end)。
- 当 begin < end 时,执行以下操作: a. 如果 S[begin] 不是字母,将 begin 向右移动一位。 b. 如果 S[end] 不是字母,将 end 向左移动一位。 c. 如果 S[begin] 和 S[end] 都是字母,交换这两个字母的位置,并将 begin 和 end 同时向中间移动一位。
- 返回处理后的字符串 S。
3.2 C++算法代码:
class Solution {
public:
string reverseOnlyLetters(string S) {
int begin = 0, end = S.length() - 1; // 初始化左右指针
while (begin < end) {
if (!isalpha(S[begin])) // 如果左指针所指的字符不是字母,则左指针右移
begin++;
if (!isalpha(S[end])) // 如果右指针所指的字符不是字母,则右指针左移
end--;
if (isalpha(S[begin]) && isalpha(S[end])) // 如果左右指针所指的字符都是字母,则交换这两个字符
swap(S[begin++], S[end--]);
}
return S; // 返回处理后的字符串
}
};