通配符匹配-LintCode
来源:互联网 发布:ug编程如何加工t型槽 编辑:程序博客网 时间:2024/04/29 12:34
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:
'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个串完全匹配才算匹配成功。函数接口如下:bool isMatch(const char *s, const char *p)
样例
一些例子:
isMatch("aa","a") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "*") → trueisMatch("aa", "a*") → trueisMatch("ab", "?*") → trueisMatch("aab", "c*a*b") → false
思路:
利用回溯法,构造函数判断在当前位置s和p是否匹配。给定位置m,n,
若p[n]是字母,若s[m]==p[n],处理m+1和n+1位置,否则返回false;
若p[n]=’?’,可以匹配任一单个字符,直接处理m+1和n+1位置;
若p[n]=’*’,匹配0个或多个字符,处理j和n+1位置(m<=j<=s.size()),
有满则条件的情况则返回true,否则返回false。
为了减少计算量,将对于m,n位置的处理结果存入到map中。
#ifndef C192_H#define C192_H#include<iostream>#include<string>#include<map>using namespace std;class Solution {public: /* * @param s: A string * @param p: A string includes "?" and "*" * @return: is Match? */ bool isMatch(string &s, string &p) { // write your code here map<pair<int, int>, bool> map;//利用map存放计算过的数据,减少运算量 return helper(s, p, 0, 0,map); } bool helper(string &s, string &p, int m, int n,map<pair<int,int>,bool> &map) { pair<int, int> pairVal = make_pair(m, n); if (map.find(pairVal) != map.end()) return map[pairVal]; if (m >= s.size() && n == p.size())//设定终止条件 return true; else if (m < s.size() && n < p.size()) { if (isalpha(p[n])) //p中元素为字母的情况,直接判断与s[m]是否相等 { if (p[n] == s[m]) return helper(s, p, m + 1, n + 1,map); else { map[pairVal] = false; return false; } } else if (p[n] == '?') //p中元素为'?',可以匹配任一单个字符,直接处理下一位 return helper(s, p, m + 1, n + 1,map); else //p中元素为'*',循环判断是否存在满足条件的情况 { bool flag = false; for (int i = m; i <= s.size(); ++i) { flag = flag || helper(s, p, i, n + 1,map); } map[pairVal] = flag; return flag; } } //此时p[n]只能为'*' else if (m >= s.size() && n < p.size()) { for (int j = n; j < p.size(); ++j) { if (p[j] != '*') return false; } return true; } else return false; }};#endif
阅读全文
0 0
- LintCode-通配符匹配
- LintCode 通配符匹配
- LintCode 通配符匹配
- 通配符匹配-LintCode
- lintcode 通配符匹配 ac代码
- LintCode (192)通配符匹配
- [Lintcode]Wildcard Matching 通配符匹配
- lintcode 通配符匹配 ac代码
- 通配符匹配
- 通配符匹配
- 通配符匹配
- 通配符匹配
- 文件名通配符匹配算法
- 通配符匹配问题
- 通配符匹配---ArjianKenter
- servlet的通配符匹配
- Wildcard Matching 通配符匹配
- AC自动机通配符匹配
- MVC ApiControler获取不到Session的值
- 基于Ubuntu下的QT制作黑白棋游戏
- RCNN,fast RCNN,faster RCNN比较归纳总结(一)
- AI开发入门路线
- Leetcode算法学习日志-718 Maximum Length of Repeated Subarray
- 通配符匹配-LintCode
- 漏洞学习记录第一天:ffmpeg漏洞理解
- 3U VPX FMC+FPGA 处理板
- LeetCode-581. Shortest Unsorted Continuous Subarray
- json数据增加字段属性
- unity多线程2
- git(1) 本地仓库
- 使用keytool命令生成证书并导入java的cacerts证书库
- nginx虚拟主机配置