LeetCode344.反转字符串
思路
双指针,一前一后。这里可以使用库函数reverse和swap
代码
void reverseString(vector<char>& s) {
int left = 0,right = s.size()-1;
while(left<right){
char c = s[left];
s[left]=s[right];
s[right]=c;
left++;
right--;
}
}
541. 反转字符串II
思路
这道题题目有点晕,其实就只有两个条件,剩余的元素大于k和小于k这两种情况。相当于那个2k是一个起点。
代码
void reverse(string &s,int i,int j){
j--;
while(i<j){
swap(s[i++],s[j--]);
}
}
string reverseStr(string s, int k) {
for(int i = 0;i<s.size();i+=2*k){
//这里直接判断剩余字符
//剩余字符大于k个
if(i+k<=s.size()){
reverse(s,i,i+k); //前闭后开
continue;
}
//剩余字符小于k个
reverse(s,i,s.size());
}
return s;
}
151. 反转字符串中的单词
思路
首先利用快慢指针去除多余的空格,先快指针做一次while循环,删除前面的空格,然后当快指针不为空格的时候,将快指针的值赋值给慢指针。最后重新定义一下数组的长度。
然后可以做两次反转,第一次是整体反转,第二次是单词反转。
代码
void reverse(string &s,int i,int j){
while(i<j){
swap(s[i++],s[j--]);
}
}
string reverseWords(string s) {
string str;
int slow=0,fast=0;
//去除多余的空格
while(fast<s.size()&&s[fast]==' ')fast++;
for(; fast < s.size();fast++){
if(s[fast]!=' '){
if(slow!=0)s[slow++]=' ';
while(fast<s.size()&&s[fast]!=' '){
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
reverse(s,0,s.size()-1);
int start = 0;
for(int step = 0; step<s.size();step++){
if(s[step]==' '){
reverse(s,start,step-1);
start=step+1;
}
}
reverse(s,start,s.size()-1);
return s;
}