2011-12-22 10 views
6

bangaloreとblrのような2つの文字列がある場合、一方が他方のサブシーケンスとして表示されるかどうかを返します。上記の場合はtrueを返しますが、bangaloreとbrlはfalseを返します。文字列内でのサブシーケンスの発生

+0

この宿題はありますか? – Blender

+0

宿題はありませんが、私が最初に考えたのは接尾辞トライでしたが、それが良い選択であるかどうかわからないので、他人の心に思い浮かぶ最初のものが何であるかを知りたがっていますか? –

答えて

17

この問題では貪欲な戦略が有効です。

  • 大きな文字列内の疑いのサブ(BLR)の最初の文字を検索(* b *のangalore)
  • は、最初の文字のインデックスプラスワン(ANGAの*のL *鉱石から始まる第二の手紙を探します)
  • あなたは、もはや文字列(マッチしない)にBLRの次の文字を見つけることができるまで続行しない
  • )は、第2の文字のインデックスプラスワン(Oの*のR *電子から始まる3番目の文字を検索し、か部分列の文字がなくなります(あなたには一致します)。ここで

C++のサンプルコードです:

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string txt = "quick brown fox jumps over the lazy dog"; 
    string s = "brownfoxzdog"; 
    int pos = -1; 
    bool ok = true; 
    for (int i = 0 ; ok && i != s.size() ; i++) { 
     ok = (pos = txt.find(s[i], pos+1)) != string::npos; 
    } 
    cerr << (ok ? "Found" : "Not found") << endl; 
    return 0; 
} 
+0

O(n)よりも良いとは思いませんか? –

+0

@princessofpersiaいいえ、前処理なしではありません。大きなテキストがあり、部分文字列を繰り返し照会する必要がある場合、多少最適化できると思います。アルファベットの各文字について、その出現のソートされたリストをテキストに格納します。次に 'O(K * logN)'で検索することができます。ここで 'K'は部分文字列の文字数、' N'はテキスト中の文字数です。 – dasblinkenlight

+0

文字列のバイナリ検索のためのlogN? –

-1

longest common subsequenceの長さを検索します。それは小さな文字列の長さに等しい場合、Nは、サブストリングの長さである真

+14

これは、フライを殺すためにスレッジハンマーを取るようなものです! LCSはO(N * M)ですが、特にマッチがない場合は欲張りよりも遅くなります。 – dasblinkenlight

+0

はい、そうです。 – MBo

1
// Solution 1 
public static boolean isSubSequence(String str1, String str2) { 
    int i = 0; 
     int j = 0; 
     while (i < str1.length() && j < str2.length()) { 
      if (str1.charAt(i) == str2.charAt(j)) { 
       i++; 
       j++; 
      } else { 
       i++; 
      } 
     } 
    return j == str2.length(); 
} 

// Solution 2 using String indexOf method 
public static boolean isSubSequenceUsingIndexOf(String mainStr, String subStr) { 
    int i = 0; 
    int index = 0; 
    while(i<subStr.length()) { 
     char c = subStr.charAt(i); 
     if((index = mainStr.indexOf(c, index)) == -1) { 
      return false; 
     } 
     i++; 
    } 

    return true; 
} 
0

O(N)溶液を、返します。

bool subsequence(string s1, string s2){ 
    int n1 = s1.length(); 
    int n2 = s2.length(); 

    if(n1 > n2){ 
     return false; 
    } 

    int i = 0; 
    int j = 0; 
    while(i < n1 && j < n2){ 
     if(s1[i] == s2[j]){ 
      i++; 
     } 
     j++; 
    } 

    return i == n1; 
}