给定一个字符串 (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-通配符匹配的更多相关文章

  1. #leetcode刷题之路10-正则表达式匹配

    匹配应该覆盖整个字符串 (s) ,而不是部分字符串.说明:s 可能为空,且只包含从 a-z 的小写字母.p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *. 示例 1:输入:s = & ...

  2. python -- leetcode 刷题之路

    第一题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], tar ...

  3. 使用Java+Kotlin双语言的LeetCode刷题之路(三)

    BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...

  4. 使用Java+Kotlin双语言的LeetCode刷题之路(二)

    BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...

  5. 使用Java+Kotlin双语言的LeetCode刷题之路(一)

    LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 1 两数之和 给定一个整数数 ...

  6. #leetcode刷题之路40-组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一次.说 ...

  7. #leetcode刷题之路32-最长有效括号

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示 ...

  8. #leetcode刷题之路30-串联所有单词的子串

    给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置.注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考 ...

  9. #leetcode刷题之路16-最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

随机推荐

  1. 网件路由器wps无法设置

    问题:网件路由器WPS设置项全为灰色,无没设置 原因:因为设置WIFI时,将ssid广播隐藏了,导致WPS功能失效,所以WPS设置项为灰色.要想设置WPS,将SSID广播恢复即可

  2. eclipse使用git命令行

    idea自带git命令,可以很方便的进行提交代码.eclipse怎么做呢,下面我简单操作一下: 第一步: 第二步: 第三步: 这样就调出来git提交的命令窗口了: 运行成功如下: 注意: git的安装 ...

  3. Linux 查看双节点是否做了SSH信任

    perl $AD_TOP/patch/115/bin/txkRunSSHSetup.pl verifyssh -contextfile=$CONTEXT_FILE -hosts=erpapp1,erp ...

  4. 关于nicescroll滚动条现在浏览器上滚动问题

    nativeparentscrolling: false //检测内容底部,并让父节点来滚动,作为原生滚动 有时候 当自定义滚动条在底部 滚动无效 可以把这个参数设置一下

  5. leetcode 刷题

    176:第二高的薪水 offset ) as secondhighestsalary; ---去掉第一个,再从第一个开始 177:第N高的薪水 ------相关子查询:子查询中引用了外层查询所引用表的 ...

  6. C# 判断程序是否已经在运行

    方式1: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //获取欲启 ...

  7. 转: SSH框架总结(框架分析+环境搭建+实例源码下载)

    原:http://blog.csdn.net/shan9liang/article/details/8803989 首先,SSH不是一个框架,而是多个框架(struts+spring+hibernat ...

  8. Zabbix日常监控(win_agent方式)

    参考博文:https://www.cnblogs.com/xqzt/p/5130469.html https://www.cnblogs.com/zoulongbin/p/6395047.html 本 ...

  9. 函数的调用 and 打印返回值 ret= mai() print(ret)

    def mai(): # mai 函数名 (yan) 形式参数 print("老板,给我一包中华") return"给你" # 返回值-- 给你ret = ma ...

  10. MySQL复制(二)Master-Slave复制实践

    1. 准备工作 首先要准备2台机器,分别安装mysql 我这里的版本是5.1.73,mysql数据库安装请参考:http://www.cnblogs.com/tangyanbo/p/4289753.h ...