459. 重复的子字符串
此题用到KMP算法,首先求出next数组,关键在于整个字符串的最长公共前后缀,
最后用n%(n-next[n-1])==0来进行判断其是不是重复字符串。
bool repeatedSubstringPattern(char * s){
int n=strlen(s);
int next[n];
next[0]=0;
int j=0;
for(int i=1;i<n;i++){ //遍历字符串,得到对应next数组
while(j>0&&s[j]!=s[i]){ //当此时已有重复字符串,但后面不能匹配
j=next[j-1]; //j退回到前一个位置
}
if(s[j]==s[i]){ //相等的情况
++j;
}
next[i]=j; //更新数组
}
return(n%(n-next[n-1])==0&&next[n-1]!=0); //n-next[n-1]得到第一个子串的长度
}
28. 实现 strStr()
本题关键在于临界点的判断,循环的次数为长的字符串长度减去短的字符串长度,因为如果长的字符串剩余要判断的字符串长度小于短的字符串长度的话就不需要再接着判断了。
int strStr(char * haystack, char * needle){
int n=strlen(haystack);
int m=strlen(needle);
for(int i=0;i+m<=n;i++){
int flag=1;
for(int j=0;j<m;j++){
if(haystack[i+j]!=needle[j]){
flag=0;
break;
}
}
if(flag){
return i;
}
}
return -1;
}
1668. 最大重复子字符串
此题所用到的方法与上题类似,但不同点在于,此题需要找连续的重复最大字符串,因此需要在下一次匹配时将下标移动到最后一个字母的下一位
int maxRepeating(char * sequence, char * word){
int n=strlen(sequence);
int m=strlen(word);
if(m>n || (m==n&&strcmp(sequence,word))){
return 0;
}
if(m==n&&!strcmp(sequence,word)){ //相等的情况
return 1;
}
int t=0,s=0;
for(int i=0;i+m<=n;i++){
int p=i,j=0;
while(sequence[p]==word[0]){
for(j=0;j<m;j++){
if(sequence[p+j]!=word[j]){ //匹配不正确退出循环
break;
}
}
if(j==m){ //此时找到子字符串
s++; //计数
p+=m; //此时sequence的下标指向p+m个
}else{
break;
}
}
t=t>s?t:s;
s=0;
}
return t;
}
1408. 数组中的字符串匹配
此题用c语言写有些麻烦,因此我用python来进行,将words进行遍历,如果能找到子字符串,则将word用append写进res列表中,返回res
class Solution:
def stringMatching(self, words: List[str]) -> List[str]:
res=[]
for i in range(0,len(words)):
for j in range(0,len(words)):
if i==j:
continue
if words[i] in words[j]:
res.append(words[i])
break
return res