151. 反转字符串中的单词
代码随想录链接:代码随想录 (programmercarl.com)
去年在牛客刷题的时候写过这个题,用的acm模式,所以输入的时候直接split,然后倒序输出就行了。卡哥不样水题,所以写了一个小时。解题思路不难,但是写代码到处都是问题。
首先我写的return,不是用参数的引用直接改,所以最后的反转单个单词需要赋值(忘记了,debug又好久)
其次就是一些细节,==写成=,去除多余空格判断slow为0的if else的逻辑写错了,判断之后直接进while替换,不需要写else。
class Solution {
public:
string removespace(string s){
//参考移除元素
//使用双指针
//需要考虑开头
int fast=0;
int slow=0;
while(fast<s.size()){
if(s[fast]==' '){
fast++;
}
else{
if(slow!=0){
s[slow]=' ';
slow++;
}
while(fast<s.size() && s[fast]!=' '){
s[slow]=s[fast];
slow++;
fast++;
}
}
}
s.resize(slow);
return s;
}
string reverse(string s, int begin, int end){
int i=begin;
int j=end;
while(i<j){
char tmp=s[i];
s[i]=s[j];
s[j]=tmp;
i++;
j--;
}
return s;
}
string reverseWords(string s) {
//先去除多余的空格
//反转整个字符串
//再每个单词反转
string s1=removespace(s);
string s2=reverse(s1,0,s1.size()-1);
int pos=0;
for(int i=0;i<=s2.size();i++){
if(i==s2.size()||s2[i]==' '){
s2=reverse(s2,pos,i-1);
pos=i+1;
}
}
return s2;
}
};
右旋字符串
读错题了。。以为是换位置,结果是顺位往后,还想用双指针呢(尴尬)
如果能再单开一个string也是简单题,i+k模s.size()就可以了
空间复杂度是o(1)的话,参考上一题的思路,先全都倒序,然后前k个翻一下,后面s.size()-k个翻一下,就可以了。
代码随想录链接:代码随想录 (programmercarl.com)
#include <iostream>
using namespace std;
string reverse(string s, int begin, int end) {
int i = begin;
int j = end;
while (i < j) {
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
i++;
j--;
}
return s;
}
int main(){
int n;
cin>>n;
string s;
cin>>s;
s=reverse(s,0,s.size()-1);
s=reverse(s,0,n-1);
s=reverse(s,n,s.size()-1);
cout<<s;
}
KMP
28. 找出字符串中第一个匹配项的下标
459. 重复的子字符串
这两题先跳过了,没太看懂。周末再看一下。