leetCode练习(10)

题目: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];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值