雁过留声 发表于 2024-5-17 14:15:37

KMP算法 Java实现

Problem: 28. 找出字符串中第一个匹配项的下标

目录

[*]解题方法
[*]思路

[*]构建next数组
[*]回溯查找

[*]复杂度
[*]Code

解题方法


[*]构建next串
[*]回溯查找next串,最后下标
思路


[*]通过最大前缀后缀能找到下一次未查找到后要回溯的位置
构建next数组

无论如何第一个数的下一次回溯位置肯定是0,因此next=0
这里的 j表示前缀起始位置 i表示后缀起始位置
假如找到字符不相同到的话,就让他一直回溯找,并且回溯赋值j = next
能找到相同字符的话就直接i++,j++,并且把next = j
这里先写while判断不相同 后写相同,是因为不相同的终点
一定是有相同的后缀或者直接竣事查找(到了字符串末尾)
回溯查找

其实和上面的思路差不多,不能查找相同字符就一直回溯,能的话就共同前进,直到j到了模式串长度
这时因为i也在前进,以是i的下标是应该返回的下标+(匹配串的长-1)
复杂度

时间复杂度:
添加时间复杂度, 示例: $O(m+n)$
空间复杂度:
添加空间复杂度, 示例: $O(m)$
Code

class Solution {

    public int strStr(String haystack, String needle) {
      return new KMP(needle).search(haystack);
    }

    public class KMP {
      private String pattern;   // 模式串
      private int[] next;
      public KMP(String pattern){
            this.pattern = pattern;
            int m = pattern.length();
            // 创建next 数组
            next = new int;
            next = 0;
            for(int i = 1,j=0; i < m; i++){
                while(j>0&&pattern.charAt(i)!=pattern.charAt(j)){
                  j = next;
                }
                if(pattern.charAt(i) == pattern.charAt(j)){
                  j++;
                }
                next = j;
            }
      }

      public int search(String text){
            int j = 0;
            for(int i=0;i<text.length();i++){
                while(j>0&&text.charAt(i) != pattern.charAt(j)){
                  j = next;
                }
                if(text.charAt(i) == pattern.charAt(j)){
                  j++;
                }
                if(j == pattern.length()){
                  return i-pattern.length()+1;
                }
            }
            return -1;
      }
    }

}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: KMP算法 Java实现