#leetcode刷题之路44-通配符匹配
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。
示例 3:
输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
思路1:
这是我第一反应的做法,就是用两个指针按顺序遍历。因为遇到‘?’时和两个字符相等是一样的操作,所以这道题主要是讨论遇到‘*’时的操作,这时需要加入一些辅助指针。
所有定义的指针为:ss(指向当前位置或pp遇到‘*’的位置)//// pp(指向一个普通位置或当前最后一个‘*’之后的位置) ////sstar (用于跳过s串中的字符)//// pstar(固定指向当前遇到的最后一个*)
#include <iostream>
using namespace std; bool isMatch(string s, string p) {
char*ss=(char*)s.data();
char*pp=(char*)p.data();
char*sstar= nullptr;
char*pstar= nullptr;
while(*ss)
{
if(*ss==*pp||*pp=='?')
{
ss++;
pp++;
}
else if(*pp=='*')
{
pstar=pp++;
sstar=ss;
}
else if(pstar)
{
pp=pstar+;
ss=++sstar;
}
else return false;
}
while(*pp == '*') ++pp;
return !*pp;
}
int main() {
string s="aaaa";
string p="***a";
std::cout <<isMatch(s,p) << std::endl;
return ;
}
思路二:
动态规划法(https://www.cnblogs.com/daleyzou/p/9535134.html):
bool isMatch(string s, string p) {
bool **dp=new bool *[s.length()+];//s.length()+1个bool*类型的一维指针
for(int i=;i<s.length()+;i++)
{
dp[i]=new bool[p.length()+];
memset(dp[i],,(p.length()+)*sizeof(bool));
}
dp[][]= true;
for(int i=;i<p.length();i++)
{
if(dp[][i]&&p[i]=='*')
dp[][i+]=true;
}
for (int i = ; i < s.length(); i++){
for (int j = ; j < p.length(); j++){
if (p[j] == '*'){
dp[i + ][j + ] = dp[i][j+] || dp[i+][j];
}else if (p[j] == '?' || s[i] == p[j]){
dp[i + ][j + ] = dp[i][j];
}
}
}
return dp[s.length()][p.length()];
}
#leetcode刷题之路44-通配符匹配的更多相关文章
- #leetcode刷题之路10-正则表达式匹配
匹配应该覆盖整个字符串 (s) ,而不是部分字符串.说明:s 可能为空,且只包含从 a-z 的小写字母.p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *. 示例 1:输入:s = & ...
- python -- leetcode 刷题之路
第一题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], tar ...
- 使用Java+Kotlin双语言的LeetCode刷题之路(三)
BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...
- 使用Java+Kotlin双语言的LeetCode刷题之路(二)
BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...
- 使用Java+Kotlin双语言的LeetCode刷题之路(一)
LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 1 两数之和 给定一个整数数 ...
- #leetcode刷题之路40-组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一次.说 ...
- #leetcode刷题之路32-最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示 ...
- #leetcode刷题之路30-串联所有单词的子串
给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置.注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考 ...
- #leetcode刷题之路16-最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...
随机推荐
- C# Visual 快捷键
编辑系 代码提示 Ctrl + J激活VS默认代码提示功能.ReSharper等插件会建议你修改快捷键. 导入命名空间 个人认为Ctrl + .是最方便的,复杂点的是Alt + Shift + F ...
- Android 获取全局Context的技巧
回想这么久以来我们所学的内容,你会发现有很多地方都需要用到Context,弹出Toast的时候需要.启动活动的时候需要.发送广播的时候需要.操作数据库的时候需要.使用通知的时候需要等等等等.或许目前你 ...
- java jvm概述及工作过程中的内存管理
java jvm 有分层的思想. java类..java文件,源文件,源代码,源程序 编译器不能把源代码直接编译成0101,除非是java语言写的操作系统. windows认识的可执行文件 ...
- 2017年秋季个人阅读计划 ---《掌握需求过程》第二版 pdf
这学期我们学习是软件需求分析,为了扩展视野,我们老师要求精读一本书,我根据老师推荐的书籍中找到了一本,名字叫做<掌握需求过程>,我大概浏览了一下这本书,这本书论述了软件开发中的重要课题—如 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- C# 队列(Queue) 和堆栈(Stack)
队列 (Queue) ...
- Mysqlbinlog工具及导出数据并转换编码导入
2014 - binlog是通过记录二进制文件方式来备份数据,然后在从二进制文件将数据恢复到某一时段或某一操作点. 1.使用mysqlbinlog工具来恢复 Mysqlbinlog日志如何开启? 在m ...
- 如何快速的给你的项目添加icon图标
如何快速的给你的项目添加icon图标 下载软件 如何制作图片 将制作的图标拖到项目当中 设置启动页 注意: 如果手动添加了启动页的话,记得将Launch Screen中的东西清除掉
- [翻译] JKLLockScreenViewController
JKLLockScreenViewController https://github.com/tiny2n/JKLLockScreenViewController Overview It is Loc ...
- 测试SDWebImage淡入淡出效果在UITableView中的重用显示问题
测试SDWebImage淡入淡出效果在UITableView中的重用显示问题 这个是在上一篇教程的基础上所添加的测试环节! 效果图(从效果图中看是没有任何重用问题的): 源码: ImageCell.h ...