从https://codegolf.stackexchange.com/questions/5529/is-string-x-a-subsequence-of-string-y
复制的问题Ť 给定字符串X和Y,确定X是否是Y的子序列。空字符串被视为每个字符串的子序列。 (例如,''和'anna'是'香蕉'的后续序列。)
他们的任何函数是否已经在Java或某些常见的库中执行此操作?
输入
X,一个可能为空的区分大小写的字母数字字符串 Y,一个可能为空的区分大小写的字母数字字符串 输出
真或假(或等价物),正确指示X是否是Y的子序列。 I / O示例
答案 0 :(得分:7)
您可以使用正则表达式来检查序列是否包含在搜索字符串中(并使用替换来将搜索字符与通配符交错。*):
String x = "anna";
String y = "banana";
x = x.replace("", ".*"); //returns .*a.*n.*n.*a.*
System.out.println(y.matches(x)); // returns true
答案 1 :(得分:2)
你看过String类了吗? y.contains(x)
应该完成您所需的全部或几乎所有内容。
我刚看到你不需要序列分组。没有现有的功能会做你想要的,但它很容易写一些东西:
boolean stringContains(String container, String contents) {
// start at the start of both strings
int rpos = 0;
int cpos = 0;
// Scan through till we reach the end of either string
while (rpos<container.length() && cpos<contents.length) {
// If they match advance both counts, otherwise just
// move on through the container
if (container.charAt(rpos) == contents.charAt(cpos)) {
rpos++;
cpos++;
} else {
rpos++;
}
}
// If we reached the end of the contents string then we have a match
return cpos==contents.length;
}
答案 2 :(得分:0)
您需要从两个字符串中删除重复的字符,然后您可以使用String#contains
来检查子序列。
答案 3 :(得分:0)
您可以使用正则表达式:
public boolean subsequence(String superString, String subString) {
StringBuilder sb = (".*");
for (char c : subString.toCharArray()) {
sb.append(c);
sb.append(".*");
}
return superString.matches(sb.toString());
}
这只是在匹配字符串中的每个字符之间插入.*
,包括开头和结尾。