即使 B 字符不连续,检查 Java 字符串 A 是否包含另一个字符串 B 的最佳方法是什么?
例如:“takaderoka”包含“tkdr”但不包含“tkkr”。
是否有内置函数,还是我必须自己编写?谢谢你。
一个简单的 java 程序,您可以将其用作实用方法。[顺序也被考虑。]
public static boolean isMatched(String s1, String s2) {
int index = -1;
for (char ch : s2.toCharArray()) {
if ((index = s1.indexOf(ch, index + 1)) == -1) {
return false;
}
}
return true;
}
...
System.out.println(isMatched("takaderoka", "tkdr")); // true
System.out.println(isMatched("takaderoka", "tkkr")); // false
你可以让它更优化:
public static boolean isMatched(String s1, String s2) {
if ((s1.length() > 0 && s2.length() == 0) || (s2.length() > s1.length())) {
return false;
} else if (s1.indexOf(s2) != -1 || s1.equals(s2)) {
return true;
} else {
int index = -1;
for (char ch : s2.toCharArray()) {
if ((index = s1.indexOf(ch, index + 1)) == -1) {
return false;
}
}
}
return true;
}
没有内置函数,但可以一行完成:
"takaderoka".matches("tkkr".replace("", ".*"));
或者把它放在一个函数中:
static boolean matcher(String one, String two) {
return one.matches(two.replace("", ".*"));
}
你可以用这个方法。可以重构以获得更好的代码。
private boolean contains(String source, String toMatch) {
boolean result = false;
if (toMatch.length() == 0 || source.length() == 0) {
return result;
}
int j = 0;
for (int i = 0; i < source.length(); i++) {
if (toMatch.length() - j > source.length() - i) {
break;
}
if (source.charAt(i) == toMatch.charAt(j)) {
j++;
}
if (j == toMatch.length()) {
result = true;
break;
}
}
return result;
}
您可以使用 String 类的 contains() 方法。查看 String 类的方法以及 Java 中的 Regex 表达式。
您可以在搜索字符串上进行正则表达式匹配,在每个字符之间插入“.*”,或者只需依次编写自己的搜索每个字符。
我会使用 apache commons StringUtils。getLevenshteinDistance()函数。
基本上,它测量您必须进行多少修改才能将一个字符串转换为另一个字符串。因此,您的问题与知道将所有其他字母转换为空值是否与它们的长度之间的差异相同。
例如
StringUtils.getLevenshteinDistance("takaderoka","tkdr"); //6,
StringUtils.getLevenshteinDistance("takaderoka","tkkr"); //7,
如果结果 = "takaderoka".length - "tkdr".length = 6,则 "takaderoka" 包含 "tkdr"