Leetcode 151 反转字符串中的单词
该题第二次刷到,第一次完全没想到思路,无从下手,第二次碰到就能想到了,先反转整个字符串,再处理多余空格(包括反转后位于字符串首的空格),再遍历每个单词进行反转,中间需要注意的细节较多,需要仔细考虑
string reverse(string s,int start,int end)
{
for(int i=start,j=end;i<j;i++,j--)
{
swap(s[i],s[j]);
}
return s;
}
string myReverse(string s)
{
//去除多余空格,查找空格并删除
int slow=0,fast=0;
while(fast<s.size()&&s[fast]==' ')
{
fast++;
}
while(fast<s.size())
{
if(fast-1>=0&&s[fast]==' '&&s[fast-1]==' ')
{
fast++;
continue;
}
else
{
s[slow++]=s[fast];
fast++;
}
}
if(s[slow-1]==' ')
{
s.resize(slow-1);
}
else
s.resize(slow);
return s;
}
string reverseWords(string s) {
string ans=myReverse(s);
int slow=0,fast=ans.size()-1;
for(;slow<fast;slow++,fast--)
{
swap(ans[slow],ans[fast]);
}
slow=0;
fast=0;
for(;fast<=ans.size();fast++)
{
if(ans[fast]==' '||fast==ans.size())
{
ans=reverse(ans,slow,fast-1);
slow=fast+1;
}
else
continue;
}
return ans;
}
Kamacoder 55 右旋字符串
本题可以作为leetcode 151的简化版本,同样的思路,但是不需要考虑空格的影响,同样先反转整个字符串,再反转前k个字母
#include<iostream>
#include<string>
#include<algorithm>
int main()
{
int k;
std::string s;
std::cin>>k;
std::cin>>s;
std::reverse(s.begin(),s.end());
std::reverse(s.begin(),s.begin()+k);
std::reverse(s.begin()+k,s.end());
std::cout<<s<<std::endl;
}
浙公网安备 33010602011771号