【字符串part02】| 28.实现strStr()、459.重复的子字符串

目录

✿LeetCode28.实现strStr()❀

✿LeetCode459.重复的子字符串❀


✿LeetCode28.实现strStr()❀

链接:28.实现strStr()

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

【字符串part02】| 28.实现strStr()、459.重复的子字符串_第1张图片 

解法一:遍历第一个字符串,找与第二个字符串相等的子字符串,若没有返回-1,时间复杂度O(n*m),代码如下:

public int strStr(String haystack, String needle) {
        // 1 <= haystack.length, needle.length <= 104
        int i=0;
        for(i=0;i

 这道题是一道典型用KMP算法解的题,关于什么是KMP算法移步我下一篇文章,此题的解法代码如下:

public int strStr(String haystack, String needle) {
        // KMP算法
        int[] next=new int[needle.length()];
        getnext(next,needle);
        int j=0;
        for(int i=0;i0 && haystack.charAt(i)!=needle.charAt(j)){
                j=next[j-1];
            }
            if(haystack.charAt(i)==needle.charAt(j)){
                j++;
            }
            if(j==needle.length()){
                return i-needle.length()+1;
            }
            
        }
        return -1;

    }
    // 获取模式传的next数组
    public void getnext(int[] next,String needle){
        //初始化
        int j=0; //j代表前缀末尾位置,也是最长相等前后缀的长度
        next[0]=0;
        for(int i=1;i0 && needle.charAt(i)!=needle.charAt(j)){
                j=next[j-1];
            }
            // 当前后缀相等时
            if(needle.charAt(i)==needle.charAt(j)){
                j++;
            }
            next[i]=j;
        }
    }

✿LeetCode459.重复的子字符串❀

链接:459.重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 

【字符串part02】| 28.实现strStr()、459.重复的子字符串_第2张图片 

此题还是KMP算法的一个应用,代码如下: 

public boolean repeatedSubstringPattern(String s) {
        // 1 <= s.length <= 104
        int[] next=new int[s.length()];
        getnext(next,s);
        int len=s.length();
        if(next[len-1]!=0 && len%(len-next[len-1])==0){
            return true;
        }
        return false;
    }
    public void getnext(int[] next,String s){
        int j=0;
        next[0]=0;
        for(int i=1;i0 && s.charAt(i)!=s.charAt(j)){
                j=next[j-1];
            }
            if(s.charAt(i)==s.charAt(j)){
                j++;
            }
            next[i]=j;
        }
    }

你可能感兴趣的:(数学建模,java,算法,数据结构,leetcode)