1

https://codegolf.stackexchange.com/questions/5529/is-string-xa-subsequence-of-string-yからコピーされた質問

T 文字列 X と Y が与えられた場合、X が Y のサブシーケンスかどうかを判断します。空の文字列は、すべての文字列のサブシーケンスと見なされます。(例えば、'' と 'anna' は 'banana' のサブシーケンスです。)

それらの機能はすでにJavaまたはこれを行ういくつかの共通ライブラリにありますか?

入力

X、空の可能性がある大文字と小文字を区別する英数字文字列 Y、空の可能性がある大文字と小文字を区別する英数字文字列 出力

X が Y のサブシーケンスであるかどうかを正しく示す True または False (または同等のもの)。 I/O の例

  • '' 'z00' 真
  • 'z00' 'z00' 真
  • 'z00' '00z0' 偽
  • 「ああ」「アンナ」真
  • 「アンナ」「バナナ」
  • 「アンナ」「バナナ」 False
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 に答える