两道kmp的题目有点整的不是太明白,第一遍我决定先跳过,由于还欠了有一天的内容,所以等以后有时间再翻回来研究研究。
151 151. 反转字符串中的单词 - 力扣(LeetCode)
这个题目看着好像挺容易,实际上写起来还是困难重重。有三个步骤,反转,去掉多余空格,单词反转。第一步反抓一个reverse即可。第二步使用双指针去空格的过程思考了很长时间,和之前移除元素的代码有类似之处,但是还是需要一定时间思考解决。第三步单词反转时也是用两个指针一个指向开头,一个指向结尾,反转之后更新开头指针。代码如下:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int low = 0;
bool flag = 0;
for (int fast = 0; fast < s.size(); fast++) {
if (s[fast] == ' ') {
continue;
} else {
if (flag == 0)
flag = 1;
else
s[low++] = ' ';
while (fast < s.size() && s[fast] != ' ') {
s[low] = s[fast];
low++;
fast++;
}
}
}
s.resize(low);
int start = 0;
for (int i = 0; i < low; i++) {
while (s[i] != ' ' && s[i] != '\0') {
i++;
}
reverse(s.begin() + start, s.begin() + i); // reverse后面是不包含的
start = i + 1;
}
return s;
}
卡码网:55.右旋转字符串 55. 右旋字符串(第八期模拟笔试)
这个题稍微就简单一些,不过我也是看完讲解才觉得简单,只需要先整体反转,再两次局部反转就ok了,可以好好思考一下这个过程。代码如下:
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
string a;
cin>>a;
reverse(a.begin(),a.end());
reverse(a.begin(),a.begin()+n);
reverse(a.begin()+n,a.end());
cout<<a;
}
字符串到今天就结束了,kmp我会找机会补回来的。