10. Regular Expression Matching
来源:互联网 发布:网络小贷与p2p的区别 编辑:程序博客网 时间:2024/06/12 04:00
1、题目描述
输入两个字符串s和p。判断p是否能与s匹配。
匹配规则:
‘.’ 匹配任意一个字符;‘*’匹配0个或更多个前面的元素。
2、思路
动态规划。
dp[i][j] 指的是s的前i位和p的前j位是否匹配。
初始化:
dp[i][j] 全都是false;
dp[0][0] = true;
dp[0][i]有可能是true;
状态转移:
1) if s[i]==p[j] || p[j]=='.', dp[i+1][j+1] = dp[i][j];
2) else if p[j] =='*'
2.1) s[i] p[j-1]无法匹配,则‘*’表示0个字符,即消去, dp[i+1][j+1] = dp[i+1][j-1];
2.2)s[i] p[j-1]匹配,则‘*’表示0个字符、多个字符只要满足一个就行
3)else dp[i+1][j+1] = false。
3、代码
bool isMatch(string s, string p) { int l1 = s.size(),l2=p.size(); bool dp[l1+1][l2+1]; for(int i=0;i<=l1;i++) for(int j=0;j<=l2;j++) dp[i][j]=false; dp[0][0]=true; for(int i=1;p[i]=='*'&&i<l2;i=i+2){ dp[0][i+1]=true; } for(int i=0;i<l1;i++) for(int j=0;j<l2;j++){ if(s[i]==p[j]||p[j]=='.') dp[i+1][j+1]=dp[i][j]; else if(p[j]=='*'){ if(s[i]!=p[j-1]&&p[j-1]!='.') dp[i+1][j+1]=dp[i+1][j-1]; else dp[i+1][j+1]=dp[i+1][j-1]||dp[i][j+1]; } else dp[i+1][j+1]=false; } return dp[l1][l2]; }
阅读全文
0 0
- 10. Regular Expression Matching
- 10.Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- 10. Regular Expression Matching
- git + zsh
- block,inline和inlinke-block细节对比及导航案例
- JavaScript中的语句结束符';'
- [Python]
- 二分查找(递归实现)
- 10. Regular Expression Matching
- vi /etc/redhat-release
- (洛谷 1164)小A点菜
- 为什么要有深度学习?系统学习清单
- AngularJS操作表格的增删改查
- PS小记
- <script language="javascript" type="text/javascript">
- 讲师修改代码
- 新一代的nRF52832加入了很多新的功能。比如Cortex-M4F的内核,它能够更强大的运算能力以及浮点运算的技术