扩展Trie匹配

问题描述

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;
using std::map;

int const Letters =    4;
int const NA      =   -1;

typedef map<char,int> edges;
typedef vector<edges> trie;

struct Node
{
    int next [Letters];

    Node ()
    {
        fill (next,next + Letters,NA);
    }

    bool isLeaf () const
    {
        return (next[0] == NA && next[1] == NA && next[2] == NA && next[3] == NA);
    }
};

int letterToIndex (char letter)
{
    switch (letter)
    {
        case 'A': return 0; break;
        case 'C': return 1; break;
        case 'G': return 2; break;
        case 'T': return 3; break;
        default: assert (false); return -1;
    }
}

trie build_trie(vector<string> &patterns) {
 
 if (patterns.empty()) {
        return trie{};
    }
 trie t{edges{}}; 
 int root{0},cnt{0};
 
 for(auto& i:patterns){
     int currentN = root;
     for(auto j:i){
         if(t[currentN].find(j)!=t[currentN].end()){
             currentN = t[currentN][j];
         }else{
            t.emplace_back(edges{});
            t[currentN][j] = ++cnt;
            currentN = cnt;
         }
     }
 }
 
 return t;
}

vector <int> solve (const string& text,int n,vector <string>& patterns)
{
    vector <int> result;
    trie t = build_trie(patterns);
    map<std::string,int> pattMap;
    for(int i=0;i<patterns.size();i++){
        pattMap.insert(std::pair<std::string,int>(patterns[i],pattMap.size()));
    }
    vector<int> pattSize;
    for(int i=0;i<patterns.size();i++){
        pattSize.push_back(patterns[i].size());
    }
    /*
    std::cout<<"Mapping"<<"\n";
    for (auto& x: pattMap) {
    std::cout << x.first << ": " << x.second << '\n';
  } 
    */
    
    // write your code here
    for(int i=0;i<text.size();++i){
        int currV =0;
        int currSId = i;
        char currS = text[currSId];
        int tC =0;
        while(true){
        if(currV==0){
            tC=1;
        }else{
            tC=currV+1;
        }
        string strT =  text.substr(i,tC);   
        if(pattMap.find(strT)!=pattMap.end()){
             //   std::cout<<"Match without end:"<<strT<<" i:"<<i<<"\n";
                result.push_back(i);
            }
        if(t[currV].empty()){
            result.push_back(i);
            break;
        }else if(t[currV].find(currS)!=t[currV].end()){
            currV = t[currV][currS];
            currS = text[++currSId];
        }else{
            break;
        }
    }

    }

     //auto res = unique(result.begin(),result.end());
    vector<int> finalR;
    if(result.size()>=1){
        finalR.push_back(result[0]);
        for(int i=1;i<result.size();i++){
        if(finalR[finalR.size()-1]!=result[i]){
        finalR.push_back(result[i]);
    }    
    }    
    }
    
    


    return finalR;
}

int main (void)
{
    string text;
    cin >> text;

    int n;
    cin >> n;

    vector <string> patterns (n);
    for (int i = 0; i < n; i++)
    {
        cin >> patterns[i];
    }

    vector <int> ans;
    ans = solve (text,n,patterns);

    for (int i = 0; i < (int) ans.size (); i++)
    {
        cout << ans[i];
        if (i + 1 < (int) ans.size ())
        {
            cout << " ";
        }
        else
        {
            cout << endl;
        }
    }

    return 0;
}
}

嗨 我正在尝试查找字符串中所有出现的模式。 输入格式为: AAAA 4 一种 机管局 AAA级 AAAA

第一行包含文本 下一行包含整数值 接下来的n行包含n种不同的模式,将在整个文本中进行检查

由于我能够通过大多数测试用例,但在最后2个上却卡住了,所以我错过了一些极端情况。

文字保护套可用于: 文字:ATGFATGFAA 模式:5 空中交通管制 ATG 在 一种 AG

有时它在同一位置多次标识同一模式,这是不正确的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)