[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');
    }
};


智慧消防安全与应急管理是现代城市安全管理的重要组成部分,随着城市化进程的加速,传统消防安全管理面临着诸多挑战,如消防安全责任制度落实不到位、消防设施日常管理不足、消防警力不足等。这些问题不仅制约了消防安全管理水平的提升,也给城市的安全运行带来了潜在风险。然而,物联网和智慧城市技术的快速发展为解决这些问题提供了新的思路和方法。智慧消防作为物联网和智慧城市技术结合的创新产物,正在成为社会消防安全管理的新趋势。 智慧消防的核心在于通过技术创新实现消防安全管理的智能化和自动化。其主要应用包括物联网消防安全监管平台、城市消防远程监控系统、智慧消防平台等,这些系统利用先进的技术手段,如GPS、GSM、GIS等,实现了对消防设施的实时监控、智能巡检和精准定位。例如,单兵定位方案通过信标点定位和微惯导加蓝牙辅助定位技术,能够精确掌握消防人员的位置信息,从而提高救援效率和安全性。智慧消防不仅提升了消防设施的管理质量,还优化了社会消防安全管理资源的配置,降低了管理成本。此外,智慧消防的应用还弥补了传统消防安全管理中数据处理方式落后、值班制度执行不彻底等问题,赋予了建筑消防设施智能化、自动化的能力。 尽管智慧消防技术在社会消防安全管理工作中的应用已经展现出巨大的潜力和优势,但目前仍处于实践探索阶段。相关职能部门和研究企业需要加大研究开发力度,进一步完善系统的功能与实效性。智慧消防的发展既面临风险,也充满机遇。当前,社会消防安全管理工作中仍存在制度执行不彻底、消防设施日常维护不到位等问题,而智慧消防理念与技术的应用可以有效弥补这些弊端,提高消防安全管理的自动化与智能化水平。随着智慧城市理念的不断发展和实践,智慧消防将成为推动社会消防安全管理工作与城市化进程同步发展的关键力量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI记忆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值