问题描述
#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 (将#修改为@)