字符串中的子序列出现

时间:2011-12-22 04:17:17

标签: string algorithm data-structures

给出像bangalore和blr这样的2个字符串,返回是否一个字符串显示为另一个字符串的子序列。上述情况返回true,而bangalore和brl返回false。

4 个答案:

答案 0 :(得分:17)

贪婪的策略应该适用于这个问题。

  • 在大字符串中找到可疑子串(blr)的第一个字母(* b * angalore)
  • 找到从第一个字母的索引加一个(anga * l * ore)
  • 开始的第二个字母
  • 找到从第二个字母的索引加上一个(o * r * e)
  • 开始的第三个字母
  • 继续,直到你再也找不到字符串中的下一个blr字母(不匹配),或者子序列中的字母用完(你有匹配)。

以下是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;
}

答案 1 :(得分: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;
}

答案 2 :(得分:0)

O(N)解,其中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;
}

答案 3 :(得分:-1)

查找longest common subsequence的长度。如果它等于小字符串的长度,则返回true