28.字符串匹配
class Solution {
public:
int strStr(string s, string p)
{
int ne[10001];
for(int i=1,j=0;i<p.size();i++)
{
while(j&&p[i]!=p[j]) j=ne[j-1];
if(p[i]==p[j]) j++;
ne[i]=j;
}
for(int i=0,j=0;i<s.size();i++)
{
while(j&&s[i]!=p[j]) j=ne[j-1];
if(s[i]==p[j])j++;
if(j==p.size())
{
//j=ne[j-1];
return i-p.size()+1;
}
}
return -1;
}
};
class Solution {
public:
int strStr(string s, string p)
{
int ne[10001];
for(int i=2,j=0;i<=p.size();i++)
{
while(j&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<=s.size();i++)
{
while(j&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1])j++;
if(j==p.size())
{
//j=ne[j];
return i-p.size();
}
}
return -1;
}
};
序号从0开始和从1开始。
459重复的子字符串
class Solution {
public:
bool repeatedSubstringPattern(string s)
{
string s2=s+s;
int n=10001;
int ne[n];
for(int i=1,j=0;i<s.size();i++)
{
while(j&&s[i]!=s[j]) j=ne[j-1];
if(s[i]==s[j]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<s2.size()-1;i++)
{
while(j&&s2[i]!=s[j]) j=ne[j-1];
if(s2[i]==s[j]) j++;
if(j==s.size())
{
return true;
}
}
return false;
}
};
和之前的区别就是 两个s相连 要掐头去尾的找s 所以i=1 <s2.size()-1