***、题目链接
一、题目
1、题目描述
给你一个字符串
s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的s
。
样例输入:"Test1ng-Leet=code-Q!"
;
样例输出:"Qedo1ct-eeLg=ntse-T!"
。
2、基础框架
- C++给出的代码框架如下:
class Solution {
public:
string reverseOnlyLetters(string s) {
}
};
二、解题报告
1、思路分析
-
解法一: 双指针
( 1 ) (1) (1) 定义一前、一后两个指针;
( 2 ) (2) (2) 遇到非字母跳过,若两个都为字母,则交换。 -
解法二: 字符串
( 1 ) (1) (1) 定义一个空字符串;
( 2 ) (2) (2) 将 s 中的字母放入空字符串,再将其逆序放入。
2、时间复杂度
O ( n ) O(n) O(n) ;
3、代码详解
class Solution {
public:
string reverseOnlyLetters(string s) {
//solve1:双指针
int n = s.size();
int i = 0, j = n - 1;
char chars;
while(i <= j){
if(!isalpha(s[i])){
++i;
} else if(!isalpha(s[j])){
--j;
} else {
chars = s[i];
s[i] = s[j];
s[j] = chars;
++i, --j;
}
}
return s;
//solve2:字符串
char temp[109];
int n = s.size();
for(int i = 0, j = 0; i < n; ++i){
if(isalpha(s[i])){
temp[j] = s[i];
++j;
}
}
for(int i = n - 1, j = 0; i >= 0; --i){
if(isalpha(s[i])){
s[i] = temp[j];
++j;
}
}
return s;
}
};
三、写在最后
双指针和字符串时间复杂度差不多,看个人喜好喽。