55. 右旋转字符串
题目链接
题解:老办法,整体反转,子串反转,三个reverse就可以解决。
#include <iostream>
using namespace std;
#include <algorithm>
int main(){
string s;
int n;
cin>>n;
cin>>s;
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
cout<<s<<endl;
}
28. 找出字符串中第一个匹配项的下标
题目链接
题解:KMPf方法没有实现,周末有空的话就看看,今天时间比较紧,先把朴素方法过了。两个指针,一个在大串,一个在小串,如果指针元素相同则一起向前,否则不进入while循环,直走i。
class Solution {
public:
int strStr(string haystack, string needle) {
int slow,fast;
for(int i=0;i<haystack.size();i++){
slow=i;
fast=0;
while(fast<needle.size()&&haystack[slow]==needle[fast]){
slow++;
fast++;
}
if(fast==needle.size()) return i;
}
return -1;
}
};
看起来时间复杂度是够的,O(m*n),但是KMP可以做到O(m+n), 之后试一下。
459. 重复的子字符串
题目链接
题解:假设s由两部分组成:s = s1 + s2
如果s是由它的一个子串 n 重复多次构成的字符串,那么s可以分为两部分:s = kn + n 即s1 = kn; s2 = n;
S = s + s = s1 + s2 + s1 + s2
去掉第一个字符和最后一个字符 S’ = s3 + s2 + s1 + s4
如果s是由一个子串重复多次构成的字符串 ,则s2 + s1 = n + k*n = n + (k-1)n + n = kn + n = s1 + s2 --> s2 + s1 = s1 + s2 = s
故如果s是由一个子串重复多次构成的字符串,则S‘中包含s。
那么S‘=s+s从下标为1处搜索,如果s由重复子串构成,则find返回1,否则,返回s.size()。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
return (s+s).find(s,1)!=s.size();
}
};