String X是String Y Java的子序列

时间:2013-12-12 13:59:25

标签: java subsequence

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示例

  • '''z00'真实
  • 'z00''z00'True
  • 'z00''00z0'False
  • 'aa''anna'True
  • 'anna''banana'True
  • '安娜''香蕉'错误

4 个答案:

答案 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());
}

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