现在的位置: 首页 > 综合 > 正文

[各种面试题] 匹配的字符串模式的个数

2017年12月23日 ⁄ 综合 ⁄ 共 1250字 ⁄ 字号 评论关闭

今天AMAZON的一道题,其实数据很弱,直接暴力都能过的。

然后第一反应是用字典树,就是如果匹配到*号的时候,就把一层都往下搜索一遍。

然后第二反应是用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;
	}
}

抱歉!评论已关闭.