题目:Regular Expression Matching
难度:hard
问题描述:
Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character. '*' Matches zero or more of the preceding element. 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", "a*") → true isMatch("aa", ".*") → true isMatch("ab", ".*") → true isMatch("aab", "c*a*b") → true
解题思路:这道题我没有太好的办法,用了很复杂的迭代,并且先对字符串进行了预处理。经过了大量的试错才编译通过。不过也是完完全全自己的结晶,丑孩子也是娘养的。在后面会贴上别人的优秀算法。
自己的丑陋算法如下:
/*****************
*
* @author zhipeng
* .匹配任意一个字符
* *匹配*号前面一个字符的0个或者x个 c*可以代表 空 、c、cc、ccc
*/
package leetCode_hard;
public class h_10_RegularExpressionMatching {
public static boolean isMatch(String s, String p) {
String res=preinit(p);
return diedai(s,res,0);
}
public static boolean diedai(String s,String p,int index){
if(s.length()==0){
// System.out.println("s="+s+" index="+index);
// System.out.println("s=空");
if(isnouse(p.substring(index))){
return true;
}
return false;
}
if(s==null||index==p.length()) return false;
char a=s.charAt(0);
char b=p.charAt(index);
// System.out.println("a="+a+" b="+b);
if(b=='.'||a==b){
if((index+1<p.length())&&p.charAt(index+1)=='*'){
if(diedai(s.substring(1),p,index)){
return true;
}else if(diedai(s.substring(1),p,index+2)){
// System.out.println(s.substring(1)+" "+(index+2)+"失败");
return true;
}else{
return diedai(s,p,index+2);
}
}else{
return diedai(s.substring(1),p,index+1);
}
}else {
if((index+1<p.length()-1)&&p.charAt(index+1)=='*'){
return diedai(s,p,index+2);
}else{
return false;
}
}
}
public static String preinit(String s){
String res="";
int p=0;
int len=s.length();
char c;
char baoliu=0;
boolean t=false;
while(p<len){
c=s.charAt(p);
if(c==baoliu){
if(p+1<len&&s.charAt(p+1)=='*'){
t=true;
p=p+2;
continue;
}else {
res=res+c;
p++;
continue;
}
}
if(c=='.'||c=='*'){
if(t==true){
res=res+baoliu+'*'+c;
baoliu=0;
t=false;
p++;
continue;
}else{
res=res+c;
baoliu=0;
p++;
continue;
}
}
if(c!=baoliu){
if(p+1<len&&s.charAt(p+1)=='*'){
if(t==true){
res=res+baoliu+'*';
}
t=true;
baoliu=c;
p=p+2;
continue;
}
if(t==true){
res=res+baoliu+'*'+c;
baoliu=c;
t=false;
p++;
continue;
}else{
res=res+c;
baoliu=c;
p++;
continue;
}
}
}
if(t==true){
res=res+baoliu+'*';
}
System.out.println(res);
return res;
}
public static boolean isnouse(String s){
// System.out.println("zzp"+s);
if(s==null) return true;
if((s.length()%2)==1) return false;
for(int i=1;i<s.length();i=i+2){
// System.out.println(s.charAt(i));
if(s.charAt(i)!='*'){
return false;
}
}
return true;
}
public static void main(String[]args){
System.out.println("a");
System.out.println(isMatch("a",".*.."));
}
}
优秀算法:
public class Solution {
public boolean isMatch(String s, String p) {
if(s==null || p==null) return false;
int slen=s.length(), plen=p.length();
char[] schar=s.toCharArray(), pchar=p.toCharArray();
boolean[][] dp=new boolean[slen+1][plen+1];
for(int i=0;i<=slen;i++){
for(int j=0;j<=plen;j++){
if(i==0&&j==0) { dp[i][j]=true;continue;}
if(i==0) { dp[i][j]=pchar[j-1]=='*'&&dp[i][j-2];continue;}
if(j==0) continue;
if(pchar[j-1]=='*'){
dp[i][j] |=(dp[i-1][j]&&(schar[i-1]==pchar[j-2]||pchar[j-2]=='.'))
||dp[i][j-1]||dp[i][j-2];
}
else if(pchar[j-1]=='.' || pchar[j-1]==schar[i-1])
dp[i][j]=dp[i-1][j-1];
}
}
return dp[slen][plen];
}
}