leetcode 44. Wildcard Matching

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false


class Solution {
public:
	bool isMatch(string s, string p) {

		if (s.empty() && p.empty())
			return true;
		if (p.empty())
			return false;
		if (s.empty())
		{
			if (p == string(p.length(), '*'))
				return true;
			return false;
		}
		clock_t start, finish;
		double Total_time;
		start = clock();
		vector<pair<string, string>>candi;//pair<string,string>(s,p)
		set<pair<string, string>>hist;
		candi.push_back(pair<string, string>(s, p));
		while (candi.size()>0)
		{
			vector<pair<string, string>>newcandi;
			for (int i = 0; i < candi.size(); i++)
			{
				string ss ( candi[i].first),pp(candi[i].second);
				bool flag = true;
				while (pp.length()>0 && ss.length() > 0 && pp[0] != '*')
				{
					if (pp[0] != '?'&&pp[0] != ss[0])
					{
						flag = false;
						break;
					}
					pp.erase(0, 1);
					ss.erase(0, 1);
				}
				while (flag&&pp.length() > 0 && ss.length() > 0 && pp.back() != '*')
				{
					if (pp.back() != '?'&&pp.back() != ss.back())
					{
						flag = false;
						break;
					}
					pp.pop_back();
					ss.pop_back();
				}
				if (!flag)
					continue;
				if (0 == pp.length() && 0 == ss.length())
					return true;
				if (0 == pp.length())
					continue;
				if (0 == ss.length())
				{
					if (pp != string(pp.length(), '*'))
						continue;
					return true;
				}
				if (pp == string(pp.length(), '*'))
				return true;
				int k = 0; vector<int>a1, a2;
				while (k < pp.length())
				{
					while (k < pp.length()&&pp[k] == '*')
						k++;
					if (k == pp.length())
						break;
					if (pp[k] == '?')
						a1.push_back(k);
					else
						a2.push_back(k);
					k++;
				}
				if (a1.size() + a2.size() > ss.length())
					continue;
				if (a2.empty())
					return true;
				int cnt = 0;
				for (int jj = 0; jj < a2[0]; jj++)
					if (pp[jj] == '*')
						cnt++;
				int gg = 0;
				while (gg < a1.size())
				{
					if (a1[gg] > a2[0])
						break;
					gg++;
				}
				int endpos = a2[0];
				while (endpos < pp.length() && pp[endpos] != '*'&&pp[endpos] != '?')
					endpos++;
				string str = string(pp.begin() + a2[0], pp.begin() + endpos);
				int pos = 0;
				pos = ss.find(str,pos);
				while (pos != string::npos)
				{
					if (pos >= gg)//if (pos >= gg&&pos < gg + cnt)
					{
						string sss(ss), ppp(pp);
						sss.erase(0, pos+str.length());
						ppp.erase(0, endpos);
						if (hist.find(pair<string, string>(sss, ppp)) == hist.end())
						{
							newcandi.push_back(pair<string, string>(sss, ppp));
							hist.insert(pair<string, string>(sss, ppp));
						}
					}
					pos = ss.find( str,pos+1);
				}
			}
			candi = newcandi;
		}
		finish = clock();
		Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
		printf("%f seconds\n", Total_time);
		return false;
	}
};

accept


你可能感兴趣的:(LeetCode)