题目描述:
力扣917.仅仅反转字母
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例
-
示例 1:
输入:“ab-cd”
输出:“dc-ba” -
示例 2:
输入:“a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba” -
示例 3:
输入:“Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”
分析:
- 需要一个left 和一个 right从两头开始走。判断是否是字母。不是字母就继续往后走。找到之后,二者一交换(这里可以使用库函数里面的交换函数std::swap)
- 判断是否是字母
(1)错误,因为A-Z 到a-z之间有其他字符
bool isLetter(char ch)
{
if (ch >= 'A' && ch >= 'z')
return true;
return false;
}
(2)更正(1)
bool isLetter(char ch)
{
if ((ch >= 'A' && ch >= 'Z')||(ch >= 'a' && ch >= 'z'))
return true;
return false;
}
(3)进阶写法
bool isLetter(char ch)
{
return ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'));
}
代码:
class Solution {
public:
bool isLetter(char ch)
{
return ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'));
}
string reverseOnlyLetters(string s) {
int left = 0;
int right = s.size()-1;
while(left < right)
{
while(left<right && !isLetter(s[left]))
left++;
while(left<right&& !isLetter(s[right]))
right--;
std::swap(s[left],s[right]);
left++;
right--;
}
return s;
}
};