文章目录
前言
今天算法的内容是:双指针
一、 反转单词前缀
给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。
例如,如果 word = “abcdefd” 且 ch = “d” ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 “dcbaefd” 。
返回 结果字符串 。
一、思路:
双指针(1) for循环下再定义一个指针进行移动,若遇见 ch,进行从 i 到 j 间字符调换,然后结束循环;
(2)找不到ch就也结束循环;
二、源码
class Solution {
public:
string reversePrefix(string word, char ch) {
for(int i=0;i<word.size();i++){
int j=i;
while(j<word.size()&&word[j]!=ch) j++;
if(word[j]==ch){
while(i<j){
int t=word[i];
word[i]=word[j];
word[j]=t;
++i,--j;
}
}
break;
}
return word;
}
};
三.知识点
双指针的应用,数组内元素的相互调换
二、 仅仅反转字母
给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
一、思路:
定义两个指针,从左向右移动若不为 字母移动动 ,从右向左扫描;若不为字母 移动,然后进行 前后调换,循环直到指针相撞;
二、源码
class Solution {
bool isWord(char a){
return a>='a'&&a<='z'||a>='A'&&a<='Z';
}
void swap(char *a,char *b){
char t=*a;
*a=*b;
*b=t;
}
public:
string reverseOnlyLetters(string s) {
int i=0,j=s.size()-1;
while(i<j){
if(!isWord(s[i])) {
++i;
continue;
}
if(!isWord(s[j])) {
--j;
continue;
}
swap(&s[i],&s[j]);
++i,--j;
}
return s;
}
};
三.知识点
双指针的应用