344.反转字符串
链接:代码随想录
代码:
class Solution { public: void reverseString(vector<char>& s) { int n=s.size(); int left=0,right=n-1; while(left<=right) { char temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; } } };
541. 反转字符串II
链接:代码随想录
class Solution { /* 0 1 2 3....k-1 k....2k-1 2k 2k+1... 3k-1 3k....4k-1 4k 4k+1... 5k-1 5k....6k-1 6k 6k+1 */ public: string reverseStr(string s, int k) { int i=0; int n=s.size(); while(i+2*k<n) { //翻转前k个字符串 fanzhuan(s,i,i+k-1); i=i+2*k; } //此时i==6k // cout<<"s== "<<s<<endl; // cout<<"i== "<<i<<endl; if(n-i<k) { cout<<"1"<<endl; fanzhuan(s,i,n-1); } else { cout<<"2"<<endl; fanzhuan(s,i,i+k-1); } return s; } void fanzhuan(string &s,int left,int right) { while(left<=right) { char temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; } } };
更简单容易理解
class Solution {
public:
string reverseS(string s)
{
int left=0;
int right=s.size()-1;
while(left<=right)
{
char ch=s[left];
s[left]=s[right];
s[right]=ch;
left++;
right--;
}
return s;
}
string reverseStr(string s, int k) {
int n=s.size();
int i=0;
string ns="";
while(i+2*k<n)
{
ns+=reverseS(s.substr(i,k))+s.substr(i+k,k);
i+=2*k;
}
if(n-i<=k)
{
ns+=reverseS(s.substr(i,n-i));
}
else
{
ns+=reverseS(s.substr(i,k))+s.substr(i+k);
}
return ns;
}
};
151.翻转字符串里的单词 -------快慢指针,特殊思路
链接:代码随想录
class Solution { public: //整个思路看代码随想录 /* 1、" the sky is blue "----------去除多余空格,单词和单词之间空格变成1个 2、"the sky is blue"-----------------整个大字符串反转 3、"eulb si yks the"------------------字符串中的每个单词反转 */ void reverse_string(string &s ,int left,int right) { while(left<=right) { char temp=s[right]; s[right]=s[left]; s[left]=temp; left++; right--; } } void removespace(string &s) { int n=s.size(); int slow=0,fast=0; //去掉前导空格,fast从第一个不为空格的开始 while(fast<n && s[fast]==' ') { fast++; } while(fast<n) { if(s[fast]==' ') { s[slow]=' '; while(fast<n && s[fast]==' ') { fast++; } slow++; } else { s[slow]=s[fast]; slow++; fast++; } } //这样有可能最后是连续的空格时,s[slow]是空格,要额外判断一下 slow--; if(s[slow]==' ') { slow--; } s.resize(slow+1);//这里不用加\0,而是用resize形成新字符串 // cout<<s<<endl; } string reverseWords(string s) { int n=s.size(); removespace(s); reverse_string(s,0,s.size()-1); int start=0; for(int i=0;i<s.size();i++) { if(s[i]==' ') { reverse_string(s,start,i-1); start=i+1; } } reverse_string(s,start,s.size()-1); return s; } };
剑指Offer58-II.左旋转字符串
链接:代码随想录
class Solution { //不能申请额外空间,只能在本串上操作。 /* abcdefg gfedcba 整体反转 cdefg ab 分块反转 */ public: string reverseLeftWords(string s, int k) { int n=s.size(); reverse_string(s,0,n-1); reverse_string(s,0,n-1-k); reverse_string(s,n-k,n-1); return s; } void reverse_string(string &s,int left,int right) { while(left<=right) { char temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; } } };