[各种面试题] 匹配的字符串模式的个数
2013-10-15 14:26
483 查看
今天AMAZON的一道题,其实数据很弱,直接暴力都能过的。
然后第一反应是用字典树,就是如果匹配到*号的时候,就把一层都往下搜索一遍。
然后第二反应是用KMP,这样复杂度是O(n * (n+m ) )的。
直接字符串读取一行还没弄出来。囧。
然后第一反应是用字典树,就是如果匹配到*号的时候,就把一层都往下搜索一遍。
然后第二反应是用KMP,这样复杂度是O(n * (n+m ) )的。
直接字符串读取一行还没弄出来。囧。
#include<iostream> #include<vector> #include<string> #include<cstdio> using namespace std; bool isMatch(char a,char b) { if(a=='*'||b=='*') return true; return tolower(a)==tolower(b); } void initP(const string& s,vector<int>& pre) { pre[0]=-1; for(int i=1;i<s.size();i++) { int p=pre[i-1]; while(p!=-1&&isMatch(s[p+1],s[i])) p=pre[p]; if(isMatch(s[p+1],s[i])) pre[i]=p+1; else pre[i]=-1; } } bool kmp(const string& s,const string& t,int& start) { vector<int> pre(t.size(),-1); initP(t,pre); int pt=-1; int len=s.size(); for(int ps=-1;ps<len;ps++) { while(pt!=-1&&!isMatch(s[ps+1],t[pt+1])) pt=pre[pt]; if(isMatch(s[ps+1],t[pt+1])) { pt++; if(pt==t.size()-1) { start=ps-t.size()+2; return true; } } } return false; } int getMatchCount(vector< string > patterns, string input) { int n= input.size(); int ans=0; vector<vector<int> > match(n,vector<int>(n,0)); for(int i=0;i<patterns.size();i++) { int start=0; if(kmp(input,patterns[i],start)) { if(match[start][start+patterns[i].size()-1]==0) { match[start][start+patterns[i].size()-1]=1; ans++; } } } return ans; } int main() { int n; while(cin>>n) { vector<string> pats(n); for(int i=0;i<n;i++) cin>>pats[i]; string input("this is a word for pattern matching"); int ans=getMatchCount(pats,input); cout << ans<<endl; } }
相关文章推荐
- 字符串处理—正则表达式和模式匹配
- KMP字符串模式匹配详解[转]
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- KMP字符串模式匹配详解
- KMP 字符串模式匹配算法
- 探究一道字符串模式匹配问题
- 算法:字符串的KMP模式匹配
- (字符串的模式匹配4.7.12)POJ 2121 Inglish-Number Translator(将英文数字转换成阿拉伯数字)
- MySQL九读书笔记 字符串模式匹配
- (字符串的模式匹配4.7.18)POJ 1961 Period(求一个串到第i个字符循环节出现的次数)
- (字符串的模式匹配4.7.18)POJ 2406 Power Strings(求一个字符串的最小重复串)
- KMP字符串模式匹配详解
- 模式匹配字母某知名外企C++面试题(算法)
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- KMP字符串模式匹配
- 字符串_模式匹配算法(求子串)
- KMP字符串模式匹配算法
- KMP字符串模式匹配
- 【算法与数据结构】字符串模式匹配
- Java数据结构之字符串模式匹配算法---KMP算法