c_cpp 提取出现在源字符串中的目标子字符串的所有组合。即:目标:“abc”,来源:“abcdefgbcahijkacb12df”,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 提取出现在源字符串中的目标子字符串的所有组合。即:目标:“abc”,来源:“abcdefgbcahijkacb12df”,相关的知识,希望对你有一定的参考价值。

/*
Extract all the the combinations of a target substring that appear in a source string. I.e: target: 
"abc", source:"abcdefgbcahijkacb12df", solution: {abc, bca, acb}
*/

// compute a hash value for a string. this function may be only suitable for letters from 'a' to 'z'
long long hash_fun(const string &t) {
    if(t.empty()) return 0;
    long long hash_val = 0;
    string s = t;
    sort(s.begin(), s.end());
    for(char c : s) {
        hash_val = 26*hash_val + c - 'a';
    }
    return hash_val;
}

// another hash function. can handle any char. 
long long hash_fun2(const string &t) {
    if(t.empty()) return 0;
    long long hash_val = 0;
    multiset<char> mset;                // note, multiset belongs to #include <set>
    for(char c : t) mset.insert(c);
    for(char c : mset) 
        hash_val = 26 * hash_val + c - 'a';
    return hash_val;
}

vector<string> extract_combinations(const string& s, const string& p) {
    vector<string> res;
    if(s.empty() || p.empty() || s.size() < p.size()) return res;
    long long hash_val = 0;
    int Ns = s.size(), Np = p.size();
    
    long long hash_val_p = hash_fun(p);
    
    for(int i=0; i<Ns - Np; i++) {
        string sub = s.substr(i, Np);
        if(hash_fun(sub) == hash_val_p)
            res.push_back(sub);
    }
    return res;
}

int main()
{
    string p = "abc";
   vector<string> vs = extract_combinations("abcdefgbcahijkacb12df", p);
   for(auto s : vs) cout << s << endl;
   return 0;
}

以上是关于c_cpp 提取出现在源字符串中的目标子字符串的所有组合。即:目标:“abc”,来源:“abcdefgbcahijkacb12df”,的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 在一个长字符串中,找到出现不止一次的最长子字符串,也称为最长的重复子字符串。

使用正则表达式从 Ruby 中的字符串中提取子字符串

ABAP基础-字符串处理

javascript检索某个字符或字符串在源字符串中的位置(下标)

c_cpp 编写一个函数来检查给定字符串是否与给定模式匹配为非连续子字符串:即,模式中的所有字符

c_cpp 最小窗口子串。给定一个字符串S和一个字符串T,找到S中的最小窗口,它将包含在Comple中的T中的所有字符