28. 找出字符串中第一个匹配项的下标、459.重复的子字符串
28. 找出字符串中第一个匹配项的下标
对于这道题,我们可以直接去一个个匹配,不用kmp算法,直接对要对比的字符串进行一个一个比较,如果,haystack的长度小于needle的长度,我们直接返回负一;
利用for循环,一个个进行比较即可
暴力解法
class Solution {
public:
int strStr(string haystack, string needle) {
int num = -1;
if(haystack.size()<needle.size())
return num;
for(int ii = 0;ii<(haystack.size()+1-needle.size());ii++)
{
for(int jj =0;jj<needle.size();jj++)
{
if(haystack[jj+ii]!=needle[jj])
{
num = -1;
break;
}
num = ii;
}
if(num==ii)
break;
}
return num;
}
};
KMP
KMP的关键在于next数组
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()>haystack.size())
return -1;
//next
int j =0;
int next[needle.size()];
next[0]=0;
for(int i = 1;i<needle.size();i++)
{
while(j>0&&needle[i]!=needle[j])
j = next[j-1];
if(needle[i]==needle[j])
j++;
next[i]=j;
}
j = 0;
int num = -1;
for(int i = 0;i<haystack.size();i++)
{
while(j>0&&haystack[i]!=needle[j])
{
j = next[j-1];
}
if(haystack[i]==needle[j])
j++;
if(j==needle.size())
return i-j+1;
}
return -1;
}
};
459.重复的子字符串
我们可以先求出该数组的next数组,如果这个数组是由重复的数组组成,那么这个数组一定存在相等的最长前后缀,因此next数组最后一位一定不为零且,字符串与字串的长度差是字符串的因子,对此我们写出代码
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int next[s.size()];
next[0] = 0;
int j = 0;
for (int i = 1;i<s.size();i++)
{
while(j>0&&s[i]!=s[j])
j=next[j-1];
if(s[i]==s[j])
j++;
next[i]=j;
}
int k = s.size()-next[s.size()-1];
if(s.size()%k||next[s.size()-1]==0)
return false;
for(j=0;j<next[s.size()-1];j++)
if(s[k+j]!=s[j])
return false;
return true;
}
};