【动态规划】C++算法:44 通配符匹配

作者推荐

【动态规划】【字符串】扰乱字符串

本文涉及的基础知识点

动态规划

LeetCode44 通配符匹配

给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配:
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。
示例 1:
输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
示例 2:
输入:s = “aa”, p = ""
输出:true
解释:'
’ 可以匹配任意字符串。
示例 3:
输入:s = “cb”, p = “?a”
输出:false
解释:‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
参数范围
0 <= s.length, p.length <= 2000
s 仅由小写英文字母组成
p 仅由小写英文字母、‘?’ 或 ‘*’ 组成

动态规划

共有mn种状态,故空间复杂度是O(nm),每种状态的转移时间复杂度是O(1),故时间复杂度是O(nm)。m和n是p和s的长度。

动态规划的状态表示dp[i][j]等于p[0,i)和s[0,j)是否匹配
动态规划的转移方程下文详细列出
动态规划的初始状态除dp[0][0]=true外,全部false
动态规划的填表顺序一,如果p[0,j)全部是*,则dp[j][0]=true。二, i,j全部从小到大。由短到长处理子字符串,确保动态规划的无后效性
动态规划的返回值dp[m][n]

转移方程

p[i-1]为*: a,不匹配任字符。b,匹配1到多个字符。匹配2个字符和匹配1个字符完全相同。
为? : 和dp[i-1][j-1]相同。
其它字符: p[i-1]==s[j-1] 且 dp[i-1][j-1]

代码

核心代码

class Solution {
public:
	bool isMatch(string s, string p) {
		const int m = p.length();
		const int n = s.length();
		vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
		dp[0][0] = true;
		for (int i = 0; (i < m)&&('*'==p[i]); i++)
		{
			dp[i + 1][0] = true;//p前面的*不匹配任何字符
		}
		for (int i = 1; i <= m; i++)
		{
			const char& ch = p[i - 1];
			for (int j = 1; j <= n; j++)
			{
				if ('*' == ch)
				{
					const bool b1 = dp[i - 1][j];//*不匹配任何字符
					const bool b2 = dp[i][j - 1];//*匹配字符1到x个字符
					dp[i][j] = b1 || b2;
				}
				else if ('?' == ch)
				{
					dp[i][j] =  dp[i - 1][j - 1];
				}
				else
				{
					dp[i][j] = dp[i - 1][j - 1]&&(ch == s[j-1]);
				}
			}
		}
		return dp.back().back();
	}
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}
}


int main()
{
	string s,p;	
	{
		Solution sln;
		s = "ab", p = "?*";
		auto res = sln.isMatch(s, p);
		Assert(true, res);
	}
	{
		Solution sln;
		s = "aa", p = "a";
		auto res = sln.isMatch(s, p);
		Assert(false, res);
	}
	
	{
		Solution sln;
		s = "aa", p = "*";
		auto res = sln.isMatch(s, p);
		Assert(true, res);
	}

	{
		Solution sln;
		s = "cb", p = "?a";
		auto res = sln.isMatch(s, p);
		Assert(false, res);
	}

}

2022 年12月

class Solution {
public:
bool isMatch(string s, string p) {
unordered_set preDp;
preDp.insert(0);
for (const auto& ch : p )
{
unordered_set dp;
if (‘*’ == ch)
{
int iMin = *std::min_element(preDp.begin(), preDp.end());
for (; iMin <= s.length(); iMin++)
{
dp.insert(iMin);
}
}
else
{
for (const auto& pre : preDp)
{
if (pre < s.length())
{
if ((‘?’ == ch) || (ch == s[pre]))
{
dp.insert(pre + 1);
}
}
}
}
preDp.swap(dp);
if (preDp.empty())
{
return false;
}
}
return *std::max_element(preDp.begin(),preDp.end()) >= s.length();
}
};

23年8月

class Solution {
public:
bool isMatch(string s, string p) {
if (p.empty())
{
return s.empty();
}
vector vp;
int left = 0;
for (int i = 0; i < p.length()😉
{
while ((i < p.length()) && (‘’ != p[i]))
{
i++;
}
//p[i]为’\0’或

vp.emplace_back(p.substr(left, i - left));
while ((i < p.length()) && (’’ == p[i]))
{
i++;
}
left = i;
}
if ('
’ == p.back())
{
vp.emplace_back(“”);
}
if (1 == vp.size())
{
return (s.length()p.length())&& (0Cmp(s,p));
}
const int iFirstLen = vp.front().length();
if (s.length() < iFirstLen)
{
return false;
}
if (0 != Cmp( s, vp.front()))
{
return false;
}
s = s.substr(iFirstLen);
vp.erase(vp.begin(), vp.begin()+1);
const int iRemain = s.length() - vp.back().length();
if (iRemain < 0)
{
return false;
}
if (0 != Cmp(s.substr(iRemain), vp.back()))
{
return false;
}
s = s.substr(0, iRemain);
vp.pop_back();
for (const auto& subP : vp)
{
const int ind = Cmp(s, subP);
if (-1 == ind)
{
return false;
}
s = s.substr(ind + subP.length());
}
return true;
}
int Cmp( const string& s , const string& strP)
{
int len = strP.length();
for (int i = 0; i+len <= s.length(); i++)
{
if (CmpInner(s, i, strP))
{
return i;
}
}
return -1;
}
bool CmpInner(const string& s,int si, const string& strP)
{
int len = strP.length();
for (int i = 0; i < len; i++)
{
if ((s[i+si] != strP[i]) && (‘?’ != strP[i]))
{
return false;
}
}
return true;
}

};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

合合TextIn团队发布 - 文档图像多模态大模型技术发展、探索与应用

合合信息TextIn&#xff08;Text Intelligence&#xff09;团队在2023年12月31日参与了中国图象图形学学会青年科学家会议 - 垂直领域大模型论坛。在会议上&#xff0c;丁凯博士分享了文档图像大模型的思考与探索&#xff0c;完整阐述了多模态大模型在文档图像领域的发展与探索…

RocketMQ单机部署完整学习笔记

文章目录 前言一、RocketMQ是什么&#xff1f;二、使用步骤1.安装MQ1.安装JDK2.安装mq3.MQ配置(核心) 2.搭建可视化dashboard1.下载源码2.修改配置3.启动 3.整合java1.生产者2.消费者3.启动生产者4.启动消费者5.dashboard添加消费组 三、总结全部的配置 前言 本文是基于4.X版本…

自创题目——吃饺子里的幸运儿

预估难度 入门 题目描述 有个饺子&#xff0c;个人&#xff0c;每人想吃个饺子&#xff0c;但是在个饺子里有1个饺子&#xff08;编号为&#xff09;的里面是1角钱&#xff0c;传说吃到这个饺子的人在一年里会很幸福。请输出吃到这个饺子的人和吃不到个饺子的人的编号。 输…

大数据时代的WEB运维高级架构师,Web系统运维工程师的实战成长之路

一、教程描述 本套WEB架构师教程&#xff0c;大小30.61G&#xff0c;共有183个文件。 二、教程目录 01-Web架构之单机时代&#xff08;共7课时&#xff09; 02-Web架构之集群时代&#xff08;共9课时&#xff09; 03-Web架构之DNS&#xff08;共6课时&#xff09; 04-Web…

如何修复卡在恢复模式的Android 手机并恢复丢失的数据

Android 系统恢复是一项内置功能&#xff0c;如果您的 Android 设备无法正常工作或触摸屏出现问题&#xff0c;该功能会很有帮助。您可以启动进入恢复模式并使用它来恢复出厂设置您的 Android 设备&#xff0c;而无需访问设置。此外&#xff0c;它还经常用于重新启动系统、从 A…

js统一公共请求处理与常用工具封装

一个完整的前端项目往往会进行一些必要的抽取公用代码进行封装&#xff0c;这里记录js常用工具及统一的公共请求的封装。 一 2017年 第一版web管理后台在用 web后台管理页面用 /*** Created by hua on 2017/8/24.*/ var requestResult{success :0,failure:1,failureMsg:2 }j…

【PTA-C语言】编程练习5 - 函数与指针

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习5 - 函数与指针 6-1 求实数和的函数&#xff08;分数 10&#xff09;6-2 求解一元二次方程实根的函数&#xff08;分数 10&#xff09;6-3 求集合数据的均方差&#xff08;分数 10&#xff09;6-4 计…

来自云仓酒庄分享为什么同一种葡萄会使用不同的名称?

如果你只是刚刚走进葡萄酒世界&#xff0c;走在葡萄酒通道上可能会令人生畏&#xff0c;因为有不同的国家、地区和生产商&#xff0c;除此之外还有数千酿酒葡萄品种。更令人困惑的是&#xff0c;有些地方对同一种葡萄使用不同的名称&#xff01;一个著名的例子是西拉和它澳大利…

Yapi安装配置(CentOs)

环境要求 nodejs&#xff08;7.6) mongodb&#xff08;2.6&#xff09; git 准备工作 清除yum命令缓存 sudo yum clean all卸载低版本nodejs yum remove nodejs npm -y安装nodejs,获取资源,安装高版本nodejs curl -sL https://rpm.nodesource.com/setup_8.x | bash - #安装 s…

免费分享:中国地下水资源分布图(附下载方法)

中国地下水资源分布图是一种展示中国各地区地下水资源丰富程度的地图。它通过不同的颜色和图案来表示地下水资源的分布情况&#xff0c;帮助我们了解中国地下水资源的分布特点和规律。 数据简介 中国地下水资源分布图展示了中国各地区地下水资源的丰富程度&#xff0c;包括地…

当老了的完美世界,押注了更老的MMO端游

​“一个测试激活码至少上千&#xff0c;还只是租号&#xff0c;只能玩几天。” 12月29日&#xff0c;完美世界重磅产品《诛仙世界》开启二测&#xff0c;斗鱼包含PPD在内等多位大主播进驻游戏&#xff0c;将游戏冲至斗鱼端游热度第一位。 游戏的测试码也被卖到了天价&#x…

移动神器RAX3000M路由器变身家庭云之四:开放LuCI管理界面,网站服务

前面已经改造成了家庭云供外网访问了。由于这个路由本来就是openwrt&#xff0c;openwrt本身的管理界面LuCI-admin很好用&#xff0c;但被屏蔽了&#xff0c;需要打开。 打开界面 ssh登录路由器&#xff0c;修改 /etc/config/uhttpd配置文件如下&#xff1a; config uhttpd …

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

解决方案是降级您的版本&#xff1a; pip install pillow9.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)

Liunx安装Nacos(单机启动&#xff0c;绑定Mysql) 一&#xff0c;准备安装包 github下载点 二&#xff0c;在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ #这里创建文件夹名字可随意&#xff0c;解压后会生成一个名为nacos的文件夹&#xff0c;后续…

CSS免费在线字体格式转换器 CSS @font-face 生成器

今天竟意外发现的一款免费的“网页字体生成器”&#xff0c;功能强大又好用~ 工具地址&#xff1a;https://transfonter.org/ 根据你设置生成后的文件预览&#xff1a; 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成&#xff0c;每个文件最大15MB。转换完成以后还会生成一…

【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)

2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一&#xff1a;调用栈方法二&#xff1a;递归方法三&#xff1a;翻转链表 2487. 从链表中移除节点 方法一&#xff1a;调用栈 1.将所有节点按顺序压入栈中 2.从…

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

WSL2连接USB设备

准备在WSL2上继续搞点事情&#xff0c;可是当我在WSL内的Linux操作系统上连接USB存储设备时却出现了问题。本文是我解决这个问题的简单记录&#xff0c;以备后查&#xff0c;如果能够帮助到您&#xff0c;那更是我莫大的荣幸。 我的环境。 windows11 22h2WSL 2 Ubuntu 2004 w…

计算机毕业设计-----SSM在线个人PC电脑商城平台网站系统

项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,一级分类管理,二级分类管理,商品管理,所有订单管理,留言管理,公告管理…

html中的form表单以及相关控件input、文本域、下拉select等等的详细解释 ,点赞加关注持续更新~

文章目录 表单创建表单forminput 标签input标签的value属性设置input标签格式单选框多选框上传文件下拉菜单文本域设置文本域格式label 标签按钮 表单 作用&#xff1a;收集用户信息。 使用场景&#xff1a; 登录页面注册页面搜索区域 创建表单form <form action".…