[LeetCode]Wildcard Matching

class Solution {
//1. No match. Simply return false. This is the last case in the program.
//2. Single match. Either *s == *p, or *p == '?'. The return value of this case depends on the 
//result of the rest parts of both s and p (recursion call), which start at the 'diagonal' position by advancing both s and p by 1 (++s, ++p)
//3. Star case, i.e. when *p == '*'. This is where the complication comes in. 
//A star can match 0, 1, 2, ..., to the end of string s. So, as long as one of the substrings match (recursion call), 
//after advance over '*', it returns true. This case returns false only after exhausting all possible substrings without a match.
//update row by row, should practice more, DP, the time complexity is O(n*m)
public:
	bool isMatch(const char *s, const char *p) {
		// Start typing your C/C++ solution below
		// DO NOT write int main() function
		if (!*s && !*p) return true;

		int ms_max = 1;//size of *s
		const char* ss = s;
		while(*ss){ ++ms_max; ++ss;}
		int np_max = 1;
		const char* pp = p;
		while(*pp){ if(*pp!='*') ++np_max; ++pp;}
		if(ms_max < np_max) return false;

		vector<vector<bool> > r(2, vector<bool>(ms_max, false));//for the sake of saving space 
		bool flag = 1;
		r[0][0] = true;
		do
		{//*p
			int ms = 1;
			ss = s;
			if (*p == '*')
			{
				while(*p == '*') ++p;//skip consecutive star
				--p;
				r[flag][0] = r[!flag][0];//from the previous row, because star can contain zero character
				for( ;ms <= ms_max; ++ms)
				{//up and left
					if (r[!flag][ms] || r[flag][ms-1]) r[flag][ms] = true;
					else r[flag][ms] = false;
				}
			}
			else
			{
				do
				{//for every character in p, update the row 
					bool r_flag = false;
					if (*ss == *p || *p == '?')
						r_flag = r[!flag][ms-1];//diagonal
					r[flag][ms]=r_flag;
					++ms;++ss;
				}while(*ss);//*s
				r[flag][0] = false;//there must be some character in ss, if current character in p is not star
			}
			++p;
			flag = !flag;//very fantastic
		}while(*p);
		return r[!flag][ms_max-1];
	}
};

second time

class Solution {
//if strlen is used, then it will be TLE
//iteration based solution
public:
    bool isMatch(const char *s, const char *p) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        //int len1 = strlen(s);
        //int len2 = strlen(p);
        
        bool star = false;
        const char* starPtr = NULL;
        const char* savePtr = NULL;
        while(*s != '\0')
        {
            if(*p == '?') s++, p++;
            else if(*p == '*')
            {
                while(*p == '*') p++;
                p--;
                starPtr = p;
                p++;
                savePtr = s;
                star = true;
            }
            else 
            {
                if(*s == *p) s++, p++;
                else
                {
                    if(star == true) s = ++savePtr, p = starPtr+1;//depend on star
                    else return false;
                }
            }
        }
        while(*p == '*') p++;
        return (*s == '\0' && *p == '\0');
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值