Java中如何在字符串中查找子字符串的函数实现方法?
在Java中,查找字符串中的子字符串是一项经常需要使用的任务。Java中提供了多种查找子字符串的函数实现方法,这些方法包括Java自带的字符串查找函数以及自定义的实现方法。
Java自带的字符串查找函数
Java中提供了多种方法来查找子字符串,其中最常用的包括indexOf()、lastIndexOf()和contains()三个方法。
1. indexOf()方法
indexOf()方法用于查找子字符串在另一个字符串中 次出现的位置。该方法原型为:
public int indexOf(String str)
其中,str是需要查找的子字符串。调用该方法时,它会返回子字符串在调用该方法的字符串中 次出现的位置,如果没有找到则返回-1。例如:
String str = "Hello World";
int index = str.indexOf("World");
// index = 6
2. lastIndexOf()方法
lastIndexOf()方法与indexOf()方法类似,不同之处在于它是查找子字符串在另一个字符串中最后一次出现的位置。该方法原型为:
public int lastIndexOf(String str)
调用该方法时,它会返回子字符串在调用该方法的字符串中最后一次出现的位置,如果没有找到则返回-1。例如:
String str = "Hello World";
int index = str.lastIndexOf("o");
// index = 7
3. contains()方法
contains()方法用于检查一个字符串是否包含另一个字符串。该方法原型为:
public boolean contains(CharSequence s)
其中,s是需要查找的子字符串。调用该方法时,如果调用该方法的字符串包含子字符串s,则返回true,否则返回false。例如:
String str = "Hello World";
boolean result = str.contains("World");
// result = true
自定义字符串查找方法
除了Java自带的字符串查找函数外,我们还可以根据需要自定义实现字符串查找方法。
1. 暴力查找法
暴力查找法是一种最简单、最基础的字符串查找方法。其实现的过程是在主串中以从左到右的顺序逐一扫描,并在扫描到每一个字符时进行比较。具体实现代码如下:
public static int search(String str, String pattern) {
int n = str.length();
int m = pattern.length();
for (int i = 0; i <= n - m; i++) {
int j;
for (j = 0; j < m; j++)
if (str.charAt(i + j) != pattern.charAt(j))
break;
if (j == m)
return i;
}
return -1;
}
该方法的时间复杂度为O(nm),其中,n和m分别是主串和模式串的长度。
2. KMP算法
KMP算法是一种判断字符串是否包含某个模式串的高效算法。其核心思想是在匹配过程中,尽可能地利用模式串本身的特点,避免对主串中已经比较过的字符重复进行比较。具体实现代码如下:
public static int search(String str, String pattern) {
int n = str.length();
int m = pattern.length();
int[] next = buildNext(pattern);
int j = 0;
for (int i = 0; i < n; i++) {
while (j > 0 && str.charAt(i) != pattern.charAt(j))
j = next[j - 1] + 1;
if (str.charAt(i) == pattern.charAt(j)) {
j++;
}
if (j == m)
return i - m + 1;
}
return -1;
}
private static int[] buildNext(String pattern) {
int[] next = new int[pattern.length()];
int k = -1;
next[0] = -1;
for (int i = 1; i < pattern.length(); i++) {
while (k != -1 && pattern.charAt(k + 1) != pattern.charAt(i))
k = next[k];
if (pattern.charAt(k + 1) == pattern.charAt(i))
k++;
next[i] = k;
}
return next;
}
该方法的时间复杂度为O(n+m),其中,n和m分别是主串和模式串的长度。
总体而言,Java中提供了多种查找字符串中子字符串的函数实现方法,使用起来非常方便简单。对于特定的需求,我们也可以根据具体情况选择合适的算法进行实现。
