Day09
28.实现 strStr()
kmp算法,主要是更新next数组,这里是只需要遍历一遍needle数组就可以,当是s【i'】!=s[j],此时找上一个数的next数组(首先知道next数组存的是这个字符串的前后缀相等的最长子串的后一位),意思是找到除了这个子串差一档的最长子串。
class Solution {
public:
void getNext(int* next,const string& s){
int j=-1;
next[0]=j;
for(int i=1;i<s.size();i++){
while(j>-1 && s[i]!=s[j+1]){
j=next[j];
}
if(s[i]==s[j+1]){
j++;
}
next[i]=j;
}
}
int strStr(string haystack, string needle) {
if(needle.size()==0){
return 0;
}
vector<int> next(needle.size());
getNext(&next[0],needle);
int j=-1;
for(int i=0;i<haystack.size();i++){
while(j>-1 && haystack[i]!=needle[j+1]){
j=next[j];
}
if(haystack[i]==haystack[j+1]){
j++;
}
if(j+1==needle.size()){
return (i-needle.size()+1);
}
}
return -1;
}
};
459.重复的子字符串
移动匹配,变成s+s中寻找一个s。
比较巧妙,重点是判断要能整除。
class Solution {
public:
void getNext (int* next, const string& s){
next[0] = -1;
int j = -1;
for(int i = 1;i < s.size(); i++){
while(j >= 0 && s[i] != s[j + 1]) {
j = next[j];
}
if(s[i] == s[j + 1]) {
j++;
}
next[i] = j;
}
}
bool repeatedSubstringPattern (string s) {
if (s.size() == 0) {
return false;
}
int next[s.size()];
getNext(next, s);
int len = s.size();
if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
return true;
}
return false;
}
};
字符串总结,
反转字符串,可以先整体反转,然后再局部反转 这里就有一个思路:先整体操作(比如去空格那道题)。然后再整体按一个规律加上空格,。尽量可以使一套规则可以应用在全部的操作上。
双指针总结:
一般是一个快指针,一个慢指针,可以做到在一个数组中实现数的修改等。
像字符串那个是从后往前存,也可以达成一样的效果