28. 实现 strStr()
思路
使用kmp算法
代码实现
class Solution {
public:
int strStr(string haystack, string needle) {
int neednext[needle.size()];
int j = -1;
neednext[0] = -1;
for(int i = 1; i < needle.size(); i ++)
{
while(j>=0&&needle[i]!=needle[j+1])
j = neednext[j];
if(needle[i]==needle[j+1])
j ++;
neednext[i] = j;
}
j = -1;
for(int i = 0 ; i < haystack.size(); i ++)
{
while(j>=0&&haystack[i]!=needle[j+1])
j = neednext[j];
if(haystack[i]==needle[j+1])
j ++;
if(j==needle.size()-1)
return i- needle.size()+1;
}
return -1;
}
};
459.重复的子字符串
思路
这道题蛮有意思,有两种做法。
第一种就是求kmp算法中的next数组,if(next[s.size()-1]!=-1&&(s.size()%(s.size()-next[s.size()-1]-1))==0)成立的话,就可以返回true。
第二种方法更有意思,一个新字符串由两个s组成,然后去掉第一个元素,在这个新字符串中查找s,如果查找到的位置在s.size(),那就说明找不到,否则就是找到了。
代码实现
求next数组法
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int next[s.size()];
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[j+1]==s[i])
j ++;
next[i] = j;
printf("%d", j);
}
if(next[s.size()-1]!=-1&&(s.size()%(s.size()-next[s.size()-1]-1))==0)
return true;
return false;
}
};
奇妙去头法
class Solution {
public:
bool repeatedSubstringPattern(string s) {
return (s+s).find(s,1)!=s.size();
}
};