leetcode

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anan.3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值