欢迎访问宙启技术站
智能推送

在Java中使用函数实现字符串匹配算法的方法

发布时间:2023-07-12 20:22:40

在Java中,可以使用函数来实现字符串匹配算法。以下是一种常用的字符串匹配算法——KMP算法(Knuth-Morris-Pratt算法)的Java实现方法。

KMP算法是一种高效的字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的基本思想是,当出现字符串不匹配时,不需要回溯到文本串S的起始位置重新匹配,而是利用已经匹配过的信息,跳过一些不可能发生匹配的状态,从而提高匹配效率。

下面,我们将通过一个函数来实现KMP算法:

public class KMP {
    public static int KMP(String s, String p) {
        int[] next = getNext(p);
        int i = 0; // i指向s的位置
        int j = 0; // j指向p的位置
        while (i < s.length() && j < p.length()) {
            if (j == -1 || s.charAt(i) == p.charAt(j)) {
                i++;
                j++;
            } else {
                j = next[j];
            }
        }
        if (j == p.length()) {
            return i - j;
        } else {
            return -1;
        }
    }

    private static int[] getNext(String p) {
        int[] next = new int[p.length()];
        next[0] = -1;
        int i = 0;
        int j = -1;
        while (i < p.length() - 1) {
            if (j == -1 || p.charAt(i) == p.charAt(j)) {
                i++;
                j++;
                next[i] = j;
            } else {
                j = next[j];
            }
        }
        return next;
    }

    public static void main(String[] args) {
        String s = "ababcabcacbab";
        String p = "abcac";
        int index = KMP(s, p);
        if (index != -1) {
            System.out.println("Pattern found at index " + index);
        } else {
            System.out.println("Pattern not found");
        }
    }
}

在上述代码中,我们定义了一个名为KMP的类,其中包含了两个函数:KMP函数和getNext函数。KMP函数用于执行KMP算法,接受两个参数s和p分别表示文本串和模式串,并返回模式串在文本串中的出现位置。

在KMP函数中,我们首先调用getNext函数获取模式串p的next数组,next数组存储了模式串中最长公共前后缀的长度。然后,根据KMP算法的思想,利用已经匹配过的信息,通过调整i和j的值来进行匹配。

getNext函数用于计算模式串p的next数组。在getNext函数中,我们使用两个指针i和j来遍历模式串p。当模式串中的字符与最长公共前后缀匹配时,i和j同时后移,并将j+1赋值给next[i];否则,j回溯到next[j]的位置。

运行上述代码,输出将是:“Pattern found at index 3”,表示模式串“abcac”在文本串“ababcabcacbab”中的出现位置为3。

综上所述,我们通过编写KMP函数和getNext函数,利用Java的字符串特性和数组操作,成功实现了KMP算法,实现了字符串匹配功能。