代码随想录第9天 字符串相关题目(2)
151. 反转字符串中的单词 - 力扣(LeetCode)
三步走,移除多余空格,整体逆序字符串,每个单词内部逆序(变为正序)
对于删除空格的操作,双指针,用一个slow来操作,加上空格就开始挪,挪到一个单词的结束
class Solution {
public:
void swapp(string &s,int begin,int end){
for(int i=begin,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
void removeEmp(string &s){
int slow=0;
for(int i=0;i<s.size();i++){
if(s[i]!=' '){
if(slow!=0){
s[slow]=' ';
slow++;
}
while(i<s.size()&&s[i]!=' '){
s[slow]=s[i];
slow++;
i++;
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
swapp(s,0,s.size()-1);
removeEmp(s);
int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。
for (int i = 0; i <= s.size(); ++i) {
if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。
swapp(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。
start = i + 1; //更新下一个单词的开始下标start
}
}
return s;
}
};
55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
要把后面的一部分整体挪到前面来,先整体逆序,再对两个部分分别逆序
#include<iostream>
using namespace std;
void swapp(string &s,int begin,int end){
int i=0,j=0;
for(i=begin,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
int main(){
int n;
string s;
cin>>n;
cin>>s;
swapp(s,0,s.size()-1);
swapp(s,0,n-1);
swapp(s,n,s.size()-1);
cout<<s<<endl;
return 0;
}
kmp问题以后再说,今天先挖个小坑