2011-12-22 27 views
6

Cho 2 chuỗi như bangalore và blr, trả lại xem chuỗi có xuất hiện như là một chuỗi của chuỗi kia hay không. Trường hợp trên trả về true trong khi bangalore và brl trả về false.Sự xuất hiện chuỗi phụ trong một chuỗi

+0

Đây có phải là bài tập về nhà không? – Blender

+0

không phải là một bài tập về nhà, điều đầu tiên tôi nghĩ là hậu tố trie nhưng không chắc chắn nếu nó là một lựa chọn tốt vì vậy muốn biết điều đầu tiên mà đến tâm trí của người khác là gì? –

Trả lời

17

Chiến lược tham lam nên hoạt động cho vấn đề này.

  • Tìm chữ cái đầu tiên của chuỗi con nghi ngờ (BLR) trong chuỗi lớn (* b * angalore)
  • Tìm chữ cái thứ hai bắt đầu từ chỉ số của chữ cái đầu tiên cộng với một (Ương Già * l * quặng)
  • Tìm chữ cái thứ ba bắt đầu từ chỉ mục của chữ cái thứ hai cộng một (o * r * e)
  • Tiếp tục cho đến khi bạn không thể tìm thấy chữ cái tiếp theo của chuỗi trong chuỗi (không khớp) hoặc bạn chạy ra khỏi các chữ cái trong các subsequence (bạn có một trận đấu).

Đây là một mẫu mã trong 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

Tôi đoán nó không thể tốt hơn O (n)? –

+0

@princessofpersia Không, không phải không có tiền xử lý. Nếu bạn có một văn bản lớn, và cần phải liên tục truy vấn nó cho các chất nền, tôi nghĩ bạn có thể tối ưu hóa nó một chút: cho mỗi chữ cái của bảng chữ cái, lưu trữ một danh sách sắp xếp các lần xuất hiện của nó trong văn bản. Sau đó, bạn có thể thực hiện tìm kiếm trong 'O (K * logN)', trong đó 'K' là số chữ cái trong chuỗi con, và' N' là số chữ cái trong văn bản. – dasblinkenlight

+0

logN cho tìm kiếm nhị phân của chuỗi? –

-1

Tìm chiều dài của longest common subsequence. Nếu giá trị này bằng với độ dài của chuỗi nhỏ, hãy trả về true

+14

Giống như dùng búa tạ để giết một con ruồi! LCS là O (N * M), nó sẽ chậm hơn tham lam, đặc biệt là khi không có trận đấu. – dasblinkenlight

+0

Có, bạn đã đúng. – 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

Giải pháp O (N), trong đó N là độ dài của chuỗi con.

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; 
} 
Các vấn đề liên quan