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

Java中如何实现字符串匹配?

发布时间:2023-11-23 18:50:29

在Java中,可以使用多种方法来实现字符串匹配。下面将介绍几种常用的方法。

1. 暴力匹配法:

暴力匹配法是一种简单直接的匹配方法,它的思路是将模式串与目标串的每个位置进行比较。如果不匹配,则将模式串向后移动一位,继续比较。

示例代码如下:

public static int bruteForceSearch(String pattern, String text) {
    int m = pattern.length();
    int n = text.length();

    for (int i = 0; i <= n - m; i++) {
        int j;
        for (j = 0; j < m; j++) {
            if (text.charAt(i + j) != pattern.charAt(j)) {
                break;
            }
        }
        if (j == m) {
            return i;
        }
    }
    return -1;
}

2. KMP算法:

KMP算法是一种优化的字符串匹配算法,它通过利用模式串自己的信息来避免进行不必要的比较。其核心思想是通过构建一个部分匹配表,根据已匹配的前缀来确定下一个比较的位置。

示例代码如下:

public static int kmpSearch(String pattern, String text) {
    int m = pattern.length();
    int n = text.length();

    int[] next = getNext(pattern);
    int i = 0, j = 0;
    
    while (i < n) {
        if (j == -1 || text.charAt(i) == pattern.charAt(j)) {
            i++;
            j++;
            if (j == m) {
                return i - j;
            }
        } else {
            j = next[j];
        }
    }
    return -1;
}

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

3. Boyer-Moore算法:

Boyer-Moore算法是一种快速的字符串匹配算法,它通过反向比较模式串与目标串,根据不匹配字符的规律来选择向后跳过的位置。

示例代码如下:

public static int boyerMooreSearch(String pattern, String text) {
    int m = pattern.length();
    int n = text.length();

    int[] right = new int[256];
    for (int i = 0; i < 256; i++) {
        right[i] = -1;
    }
    for (int i = 0; i < m; i++) {
        right[pattern.charAt(i)] = i;
    }
    
    int skip;
    for (int i = 0; i <= n - m; i += skip) {
        skip = 0;
        for (int j = m - 1; j >= 0; j--) {
            if (text.charAt(i + j) != pattern.charAt(j)) {
                skip = Math.max(1, j - right[text.charAt(i + j)]);
                break;
            }
        }
        if (skip == 0) {
            return i;
        }
    }
    return -1;
}

这些是常用的几种字符串匹配算法,在实际应用中可以根据具体情况选择合适的算法来实现字符串的匹配。