String、动态规划——正则表达式匹配
2016-05-12 17:42
357 查看
题目描述:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。递归法在leetcode上超时通不过。
public class Solution { public boolean match(char[] str, char[] pattern) { if(str == null||pattern == null) return false; return matchCore(str,0,pattern,0); } public boolean matchCore(char[] str,int sindex,char[]pattern,int pindex) { if(sindex == str.length&&pindex == pattern.length) return true; if(pindex == pattern.length&&sindex!=str.length) return false; if(sindex == str.length&&pindex<pattern.length) { if(pindex+1<pattern.length&&pattern[pindex+1]=='*') return matchCore(str,sindex,pattern,pindex+2); else return false; } if(pindex+1<pattern.length&&pattern[pindex+1] == '*') { if(pattern[pindex]==str[sindex]||pattern[pindex]=='.') { return matchCore(str,sindex+1,pattern,pindex+2)|| matchCore(str,sindex+1,pattern,pindex)|| matchCore(str,sindex,pattern,pindex+2); } if(pattern[pindex]!=str[sindex]) { return matchCore(str,sindex,pattern,pindex+2); } } else if(pattern[pindex]==str[sindex]||pattern[pindex]=='.') { return matchCore(str,sindex+1,pattern,pindex+1); } return false; } }
动态规划法:用空间换时间
boolean型辅助矩阵flag[i][j]表示s.length == i and p.length == j 时匹配情况
。自底向上的动态规划法:
1.边界条件在矩阵中赋值;
2.一般条件使用递推公式自底向上对矩阵赋值;
3.返回flag[i][j]的值,即为s字符串长度为i,p为j时的匹配情况。
public class Solution { public boolean isMatch(String s, String p) { if(s == null||p == null) return false; boolean [][]flag=new boolean[100][100]; //flag[i][j]表示s.length == i and p.length == j 时匹配情况 //使用自底向上的方法 flag[0][0]=true; int m=s.length()+1; int n=p.length()+1; //s.length!=0,p.length == 0时,全部为false; for(int i=1;i<m;i++) { flag[i][0]=false; } //p.length!=0,s.length == 0时的情况。 for(int j=1;j<n;j++) { if(j>=2&&p.charAt(j-1) == '*')//去掉p.charAt(0) == '*'的情况; { flag[0][j]=flag[0][j-2]; }else { flag[0][j]=false; } } for(int i=1;i<m;i 9c0f ++) { for(int j=1;j<n;j++) { if(j>=2&&p.charAt(j-1) == '*')//去掉p.charAt(0) == '*'的情况; { if(p.charAt(j-2) == s.charAt(i-1)||p.charAt(j-2) == '.') { flag[i][j]=flag[i][j-2]||flag[i-1][j]||flag[i-1][j-2]; } else { flag[i][j]=flag[i][j-2]; } } else if(p.charAt(j-1) == s.charAt(i-1)||p.charAt(j-1) == '.') { flag[i][j]=flag[i-1][j-1]; } else { flag[i][j]=false; } } } return flag[m-1][n-1]; } }
相关文章推荐
- ListView
- CentOS下设置ipmi
- zeroc-ice网络请求使用介绍
- java用Date类实现倒计时
- Handler和HandlerThread简单研究
- 使用k近邻算法实现手写体识别
- 作业二
- centos安装docker容器
- vmdata
- jquery 获取属性的值
- 邮件中继如何解决邮件退信问题
- jqgrid中修改行 背景色
- HoloLens开发手记 - Unity之摄像头篇
- 邮件中继如何解决邮件退信问题
- Selenium - Drive Chrome
- 值得安利的iOS开发利器
- svn提交项目的时候如何把新创建的文件也提交上去
- 在VS2010解决方案中增加App.config
- 一些java中的官方API的应用场景
- Android开发设计模式之——单例模式关于线程不安全问题处理