一、知识点介绍
二、练习题目
(1)2000. 反转单词前缀
(2)917. 仅仅反转字母
三、算法思路
1. 反转单词前缀
(1)双指针,左指针就是数组的第一位,右指针就是查到的元素的位置;
(2)查到之后开始交换,并且l++,r–。
class Solution {
void swap(char *a, char *b) {
int temp = *a;
*a = *b;
*b = temp;
}
public:
string reversePrefix(string word, char ch) {
int l = 0, r = 0;
int i;
for(i = 0; i < word.size(); ++i) {
if(word[i] == ch) {
r = i;
break;
}
}
while(l < r) {
swap(&word[l], &word[r]);
l++;
r--;
}
return word;
}
};
2.仅仅反转字母
(1)双指针,l指向第一个元素,r指向最后一个元素,判断是不是字母,如果是字母的话就交换;如果不是的话就跳过。
(2) 判断字母方法就是通过判断是不是在a<i<z和A<i<Z。
class Solution {
bool isLetter(char a) {
if((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z')) return true;
return false;
}
void swap(char *a, char *b) {
int temp = *a;
*a = *b;
*b = temp;
}
public:
string reverseOnlyLetters(string s) {
int i;
int l = 0;
int r = s.size() - 1;
while(l<r) {
if(isLetter(s[l]) && isLetter(s[r])) {
swap(&s[l], &s[r]);
l++;
r--;
}
if(!isLetter(s[l])) l++;
if(!isLetter(s[r])) r--;
}
return s;
}
};