bangaloreとblrのような2つの文字列がある場合、一方が他方のサブシーケンスとして表示されるかどうかを返します。上記の場合はtrueを返しますが、bangaloreとbrlはfalseを返します。文字列内でのサブシーケンスの発生
答えて
この問題では貪欲な戦略が有効です。
- 大きな文字列内の疑いのサブ(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;
}
O(n)よりも良いとは思いませんか? –
@princessofpersiaいいえ、前処理なしではありません。大きなテキストがあり、部分文字列を繰り返し照会する必要がある場合、多少最適化できると思います。アルファベットの各文字について、その出現のソートされたリストをテキストに格納します。次に 'O(K * logN)'で検索することができます。ここで 'K'は部分文字列の文字数、' N'はテキスト中の文字数です。 – dasblinkenlight
文字列のバイナリ検索のためのlogN? –
はlongest common subsequenceの長さを検索します。それは小さな文字列の長さに等しい場合、Nは、サブストリングの長さである真
これは、フライを殺すためにスレッジハンマーを取るようなものです! LCSはO(N * M)ですが、特にマッチがない場合は欲張りよりも遅くなります。 – dasblinkenlight
はい、そうです。 – MBo
// 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;
}
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;
}
- 1. 文字列のサブシーケンスのクエリ
- 2. 文字列内の文字列の発生回数をカウントする
- 3. 辞書内の文字列の中で最も長いサブシーケンスを見つける
- 4. javascript文字列内でランダムに発生した文字列を見つける
- 5. Oの文字列内のサブストリングの発生回数(N)
- 6. K個の別個の文字を含む文字列のサブシーケンスの数
- 7. Regex文字列内の数字で複数の発生を照合する#
- 8. 文字列中で最長類似サブシーケンスを見つける
- 9. 文字発生
- 10. 配列のサブシーケンス
- 11. 配列内の文字列を文字列変数にコピーする際に問題が発生しました
- 12. 各文字列が配列内で発生する回数を取得する
- 13. セル内で文字列が発生したときの検索Excel
- 14. 文字列内の文字列
- 15. 文字列内のJavascript文字列
- 16. 文字列内の部分文字列
- 17. Cの文字列のコピーでエラーが発生しました
- 18. 0xC0020001:文字列バインディングが無効です。 - WPFでのみ発生
- 19. 文字列内のパターンの合計発生回数をカウントする
- 20. JavaScript内の4 "文字の間の文字列内の文字列の置換
- 21. 最長のパリンドローム部分文字列を見つける(サブシーケンスではない)
- 22. 文字の第二の発生後の文字列を返すとPHP
- 23. 文字列内で発生した文字列の数を検索しますが、特定の文字で始まる
- 24. 文字列のCoutでエラーが発生しています。
- 25. 日本語の文字列でエラーが発生しました。
- 26. C++のマップと文字列変換でエラーが発生する
- 27. 文字列のソート中にcプログラムでセグメンテーションエラーが発生する
- 28. Rubyの文字列でランダムなエラーが発生する
- 29. 文字列内の特定の文字を削除する際に問題が発生します。
- 30. Rails文字列内の文字列内の補間
この宿題はありますか? – Blender
宿題はありませんが、私が最初に考えたのは接尾辞トライでしたが、それが良い選択であるかどうかわからないので、他人の心に思い浮かぶ最初のものが何であるかを知りたがっていますか? –