KMP算法

28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

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

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

最常规直观

直接src 字符串和 des 字符串,一个一个的比较,如果出现不一样,则src 开始位置前移一位,des 字符串从0 位置开始,再次比较,直到 src 字符串结束

    public int strStr(String haystack, String needle) {
        if(haystack==null || needle==null || haystack.isEmpty() || needle.isEmpty())
            return -1;

        int len1=haystack.length(),len2=needle.length();

        for(int i=0;i

KMP 算法

src      >abcdabefgh 

dst      >adcdadf   

当比较到 adcdab 后,就出现了不一样,这个时候从头开始又比较;KMP 算法优化这里;

1、获取 dst 字符串的子串相同前缀后缀长度

子串a同前缀后缀    ->0         f(0)=0

子串ad同前缀后缀  ->0        

子串adc同前缀后缀  ->0

子串adcd同前缀后缀  ->0

子串adcda同前缀后缀  -> a  ->1

子串adcdad同前缀后缀->ad ->2

.......

f(n)=    f(n-1)>0,则比较最后一个字符串和f(n-1)对于字符串的f(n-1)+1 位置是否相等

           f(n-1)=0,则比较最后一个字符串跟首字符串是否相等

KMP 算法,暴力匹配获取子串同前缀后缀长度

字符串 aabaaab

KMP[0]=0
KMP[1]=1
KMP[2]=0
KMP[3]=1
KMP[4]=2
KMP[5]=2
KMP[6]=3
 

    public static void KMP_string(String s,int[] KMP){
        //i 表示字符串字串长度,0~len-1
        for(int i=0;i

使用递归计算KMP

你可能感兴趣的:(算法相关,算法,linux,运维)