java 用字符串匹配算法来查询字符串数组中的元素 返回匹配的数组下标

文章介绍了如何利用KMP算法在字符串数组中搜索匹配的元素。首先,详细阐述了KMP算法的核心方法`kmp()`及其`getNext()`辅助函数,用于计算模式串的next数组。接着,展示了遍历字符串数组并应用KMP算法进行匹配的过程。最后,通过一个示例演示了如何找到匹配的字符串在原数组中的下标。
摘要由CSDN通过智能技术生成

可以使用字符串匹配算法(如 KMP 算法、Boyer–Moore 算法、Rabin-Karp 算法等)来查询字符串数组中的元素,并返回匹配的数组下标。下面以 KMP 算法为例来说明实现过程:

  1. 实现 KMP 算法的核心方法 kmp(),该方法接受两个参数,分别为文本串和模式串。该方法的返回值表示从文本串中匹配到的子串的起始下标,如果匹配失败,则返回 -1。
private static int kmp(String text, String pattern) {
    int n = text.length();
    int m = pattern.length();

    int[] next = getNext(pattern); // 获取 pattern 的 next 数组

    int i = 0, j = 0;
    while (i < n && j < m) {
        if (j == -1 || text.charAt(i) == pattern.charAt(j)) { // 匹配成功或者 j 指针已经退回到 pattern 开头了
            i++;
            j++;
        } else {
            j = next[j]; // 退回 j 指针
        }
    }

    if (j == m) { // 匹配成功
        return i - j;
    } else { // 匹配失败
        return -1;
    }
}
  1. 实现获取模式串的 next 数组的方法 getNext()next 数组的含义是,对于模式串 pattern 中的每个字符,next[i] 表示如果第 i 个字符匹配失败,下一次匹配应该从模式串中的哪个位置开始。具体的实现方式可以参考 KMP 算法的原理,这里不再赘述。
private static int[] getNext(String pattern) {
    int m = pattern.length();
    int[] next = new int[m];
    next[0] = -1;
    int i = 0, j = -1;
    while (i < m - 1) { // 注意这里是 m - 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.遍历字符串数组,对每个元素使用 kmp() 方法进行匹配,如果匹配成功,则返回该字符串在原数组中的下标。

private static int search(String[] arr, String pattern) {
    for (int i = 0; i < arr.length; i++) {
        int index = kmp(arr[i], pattern);
        if (index != -1) {
            return i;
        }
    }
    return -1; // 没有找到匹配的字符串
}

4.调用 search() 方法进行查询,并打印匹配的数组下标

public static void main(String[] args) {
    String[] arr = {"apple", "banana", "orange", "peach"};
    String pattern = "orange";
    int index = search(arr, pattern);
    System.out.println(index); // 输出 2
}

这样,就完成了使用字符串匹配算法来查询字符串数组中的元素,并返回匹配的数组下标的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值