44. Wildcard Matching *HARD*
2016-03-06 17:58
295 查看
'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). The function prototype should be: bool isMatch(const char *s, const char *p) Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false 1. 动态规划
bool isMatch(string s, string p) { int ls = s.length(), lp = p.length(), i, j; vector<vector<bool>> dp(2, vector<bool>(lp+1, 0)); bool k = 1; dp[0][0] = 1; for(i = 1; i <= lp; i++) dp[0][i] = dp[0][i-1] && '*' == p[i-1]; for(i = 1; i <= ls; i++) { dp[k][0] = 0; for(j = 1; j <= lp; j++) { if('*' == p[j-1]) dp[k][j] = dp[k][j-1] || dp[!k][j]; else dp[k][j] = dp[!k][j-1] && (p[j-1] == s[i-1] || '?' == p[j-1]); } k = !k; } return dp[!k][lp]; }
2. 不匹配的时候回到上一个星号的地方,使星号多匹配一个字符。
bool isMatch(string s, string p) { int ls = s.length(), lp = p.length(), last_i = -1, last_j = -1, i = 0, j = 0; while(s[i]) { if('*' == p[j]) { j++; if(!p[j]) return 1; last_i = i; last_j = j; } else if(s[i] == p[j] || '?' == p[j]) { i++; j++; } else if(last_i != -1) { i = ++last_i; j = last_j; } else return 0; } while('*' == p[j]) j++; return !p[j]; }
相关文章推荐
- Linux系统启动过程分析
- leetcode:Pascal's Triangle 【Java】
- HDU 5635 ——LCP Array ——————【想法题】
- js实现页面自动跳转
- PHP一键比对更新MYSQL数据库的一些想法
- 直插,快排,堆排,归并--四种排序讲解
- linux内核第二周
- 学习进度博客一
- STL与泛型编程<三>:deque
- 工信部出台《网络出版服务管理规定》
- 通过dom4j读取xml实现数据库连接
- 广搜格式
- android简单实例---------ActionBar的简单使用(三,补充)
- 初认SSH框架
- 算导--最大子数组问题
- Hibernate实现增删改查
- 利用xposed绕过安卓SSL证书的强校验
- 【转】求质数算法的N种境界
- 【CodeVS1056】圆内三角形统计
- 支付漏洞总结 / 在线支付流程安全分析