Leetcode 44. Wildcard Matching
2016-04-25 10:54
429 查看
问题
https://leetcode.com/problems/wildcard-matching/解法一(DP)
时间复杂度4000
O(n*m) 空间复杂度 2∗m与正则匹配dp实现相同
参考:
http://blog.csdn.net/galaxy_wolf/article/details/51111906
class Solution { public: bool isMatch(string s, string p) { bool dp[2][p.size()+1]; memset(dp, 0, sizeof(dp)); int cur = 0; dp[cur][0] = true; for (int i=1; i<=p.size(); ++i) if (p[i-1] == '*') dp[cur][i] = dp[cur][i-1]; for (int i=0; i<s.size(); ++i) { dp[!cur][0] = 0; for (int j=1; j<=p.size(); ++j) { if (p[j-1]=='*') { // 0 1 multi dp[!cur][j] = dp[!cur][j-1] | (dp[cur][j-1]) | dp[cur][j]; }else{ if (dp[cur][j-1] && (p[j-1] == '?' || p[j-1] ==s[i])) dp[!cur][j] = true; else dp[!cur][j] = false; } } cur = !cur; } return dp[cur][p.size()]; } };
解法二(回溯)
由于本题中只会有一种变长匹配”*”, 在出现”*”处我们都要枚举 “*” 匹配0~多个,的情况,如果之后不匹配则要回到”*” 处。如果p中存在多个”*”我们只需要在最后一个出现的”*” 处进行回溯,这是因为如下面的例子:s:cabcefabcd
p:c*abc*d
此时有两种匹配方案, 第一个* 匹配0个字符第二个* 匹配5个字符
第二种方案, 第一个* 匹配5个字符第二个* 匹配0个字符
如果将*abc* 看做一个整体,那么在要让*abc与s中某一段相匹配,在后一个* 处枚举匹配0~多个,就可以将*abc* 能够匹配的所有情况列举出来。
因此时间复杂度为 o(n*m), 空间复杂度O(1)
而在正则匹配中由于存在多个可变长的匹配项,我们必须在每个可变长匹配项处回溯:
如
s:aaaccc
p:a*c*accc
此时必须枚举到a* 匹配2个a, c* 不匹配才能得到s与p匹配。
class Solution { public: bool isMatch(string s, string p) { int star = -1; int ss = 0; int i =0; int j= 0; while(i< s.size()) { if (j <p.size() && p[j]=='?' || p[j] ==s[i]) { ++i; ++j; }else if (j< p.size() && p[j] == '*') { star = j+1;// next ss = i; //0 j = star; }else if (star >= 0) { j = star; i = ++ss;// 1...mulit }else { return false; } } while(j<p.size() && p[j]=='*') ++j; if (i==s.size()&& j==p.size()) return true; return false; } };
相关文章推荐
- scala类型系统:12) view bounds
- 网络通信框架Volley使用详细说明
- 前端开发框架对比
- Python学习(14)模块二
- 【转】外国朋友出的js题目,你能对几道
- JAVA基础--工厂模式
- 大写的跑步膝!!
- ORACLE UTL_FILE.FOPEN用法
- 卧槽,给自己提个醒
- Linux下更新build-tools-20.0.0显示The package filter removed all packages.
- Linux mount挂载目录
- FZU 1895
- 自定义ListView的使用及忧化(通俗易懂,原创)
- 2651: 城市改建 树形DP
- Etag Last-Modified
- 调用sed命令的三种方式
- jdbc使用
- linux修改挂载目录
- Java实现音频格式转换 WAV—mp3,可使音频压缩
- SMTP协议发送邮件