寻找子串

题目: https://www.nowcoder.com/questionTerminal/266fa434c2b641fc8c5f430de127c64f
给出m个字符串S1,S2,…,Sm和一个单独的字符串T。请在T中选出尽可能多的子串同时满足: 1)这些子串在T中互不相交。 2)这些子串都是S1,S2,…,Sm中的某个串。 问最多能选出多少个子串。

输入描述:
第一行一个数m(1≤m≤10),接下来m行,每行一个串。最后一行输入一个串T。输入中所有单个串的长度不超过100000,串中只会出现小写字母。

输出描述:
输出一个数,最多能选出多少串。

输入:
3
aa
b
ac
bbaac

输出
3

#include 
#include 
#include 
#include 
using namespace std;
  
int maxCount(vector<string>& sub,string& src) {
    vector<int> result(src.length() + 1,0);  //res为0-length,共 length+1 个元素,且初始化为0
    sort(sub.begin(), sub.end(), [](string& s1, string& s2)->bool {return s1.length() < s2.length(); });
    // 字符串从小到大排序,方便与后续的k==-1 break
    int maxLen;
    for (int i = 1; i <= src.length();i++) {                           //循环容量
        maxLen = 0;
        for (int j = 0;j < sub.size() && sub[j].length() <= i; j++) {   // 循环各个字符串
            int k = sub[j].length() - 1;
            for (; k >= 0;--k) {
                if (sub[j][k] != src[i - sub[j].length() + k]) {
                    break;
                }
            }
            if (k ==-1) {
                maxLen = result[i - sub[j].length()] +1;
                break;
            }
        }
        result[i] = max(maxLen, result[i-1]);
    }
    return result[src.length()];
}
  
  
int main() {
    int nums;
    vector<string> subStrs;
    string terget;
  
    cin >> nums;
    for (int i = 0; i < nums; i++) {
        cin >> terget;
        subStrs.push_back(terget);
    }
    cin >> terget;
    cout << maxCount(subStrs,terget);
}

你可能感兴趣的:(剑指offer,字符串,子串)