1

从https://codegolf.stackexchange.com/questions/5529/is-string-xa-subsequence-of-string-y复制的问题

T 给定字符串 X 和 Y,判断 X 是否是 Y 的子序列。空字符串被认为是每个字符串的子序列。(例如,'' 和 'anna' 是 'banana' 的子序列。)

他们的任何功能是否已经在 J​​ava 或一些通用库中?

输入

X,一个可能为空的区分大小写的字母数字字符串 Y,一个可能为空的区分大小写的字母数字字符串 输出

True 或 False(或等效项),正确指示 X 是否是 Y 的子序列。 I/O 示例

  • '' 'z00' 真
  • 'z00' 'z00' 真
  • 'z00' '00z0' 假
  • 'aa' '安娜' 真
  • '安娜' '香蕉' 真
  • '安娜' '香蕉' 错误
4

4 回答 4

7

您可以使用正则表达式来检查该序列是否包含在您的搜索字符串中(并使用替换将您的搜索字符与通配符 .* 交错):

     String x = "anna";
     String y = "banana";
     x = x.replace("", ".*");  //returns .*a.*n.*n.*a.*

     System.out.println(y.matches(x));  // returns true
于 2013-12-12T14:53:11.877 回答
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;
}
于 2013-12-12T14:01:48.917 回答
0

您需要从两个字符串中删除重复的字符,然后您可以使用它String#contains来检查子序列。

于 2013-12-12T14:29:43.887 回答
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());
}

这只是.*在匹配字符串中的每个字符之间插入,包括开头和结尾。

于 2013-12-12T14:55:43.137 回答