可以使用字符串匹配算法(如 KMP 算法、Boyer–Moore 算法、Rabin-Karp 算法等)来查询字符串数组中的元素,并返回匹配的数组下标。下面以 KMP 算法为例来说明实现过程:
- 实现 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;
}
}
- 实现获取模式串的
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
}
这样,就完成了使用字符串匹配算法来查询字符串数组中的元素,并返回匹配的数组下标的操作。