数据结构与算法-暴力匹配算法&KMP算法

文章目录

  • 字符串匹配问题
  • 一、暴力匹配算法&KMP算法
  • 二、源码
    • 1.暴力匹配算法
    • 2.KMP算法
  • 总结


字符串匹配问题

一、暴力匹配算法&KMP算法

数据结构与算法-暴力匹配算法&KMP算法_第1张图片

KMP算法:在这里插入图片描述

二、源码

1.暴力匹配算法

代码如下(示例):

package Algorithm;

//暴力匹配算法 思路:依次进行查找
public class ViolenceMatch {
    public static void main(String[] args) {
        String s1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅谷你好";
        String s2 = "尚硅谷你尚硅谷你好";
        int index = Violence(s1, s2);
        System.out.println("第一次匹配成功的索引"+index);
    }

    /**
     *
     * @param s1 匹配的长字符串
     * @param s2 匹配的短字符串
     * @return  如果匹配成功,则返回长字符串的第一次匹配成功的下索引,没有则返回-1
     */
    public static int Violence(String s1, String s2) {
        char[] S1 = s1.toCharArray();
        char[] S2 = s2.toCharArray();
        int S1length = S1.length;
        int S2length = S2.length;
        int i = 0;
        int j = 0;
        while (i < S1length && j < S2length) {
            if (S1[i]==S2[j]){
                i++;
                j++;
            }else {
                i = i-(j-1);
                j =0;
            }
        }
        //当j增长到S2的长度时,就表示已经遍历完了整个S2
        if (j==S2.length){
            return i-j;
        }else {
            return -1;
        }
    }
}

2.KMP算法

代码如下(示例):

package Algorithm;

public class KMP {
    public static void main(String[] args) {
        String s1 = "BBC ABCDAB ABCDABCDABDE";
        String s2 = "ABCDABD";
        int[] Next = Next(s2);
        int index = KMPSearch(s1, s2, Next);
        System.out.println("index="+index);


    }

    //得到部分匹配表Next String是子字符串
    public static int[] Next(String s) {
        int[] next = new int[s.length()];
        next[0] = 0;
        for (int i = 1, j = 0; i < s.length(); i++) {
            while (j > 0 && s.charAt(i) != s.charAt(j)) {
                j = next[j - 1];
            }
            if (s.charAt(i) == s.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next;
    }

    /**
     * @param s1   匹配的字符串
     * @param s2   子串
     * @param Next 部分匹配值
     * @return 如果找到就返回第一次匹配的索引,如果没找到就返回-1
     */
    public static int KMPSearch(String s1, String s2, int[] Next) {
        for (int i = 0, j = 0; i < s1.length(); i++) {
            while (j > 0 && s1.charAt(i) != s2.charAt(j)) {
                j = Next[j - 1];
            }
            if (s1.charAt(i) == s2.charAt(j)) {
                j++;
            }
            if (j == s2.length()) {
                return i - j + 1; //当j增加到最后一个时,i没有增加,所以要减一
            }
        }
        return -1;
    }
}

总结

暴力匹配就是每次移动一个位置。kmp有点巧妙,想深入理解看对应的链接,这里记住公式就好了。

你可能感兴趣的:(数据结构与算法,算法,字符串,数据结构,java,leetcode)