leetcode--Regular Expression Matching

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

The algorithm of this problem is DFS

public class Solution {
    public boolean isMatch(String s, String p) {
        int slen = s.length();
        int plen = p.length();
        boolean isMatch = false;
        if(plen == 0)
            isMatch = (slen == 0)? true : false;
        else{
            StringBuffer first = new StringBuffer(p);
            Stack<IndexChar> indcha  = new Stack<IndexChar>();
            Stack<StringBuffer> checked = new Stack<StringBuffer>();
            
            //remove the leading '*'s
            while(first.charAt(0) == '*'){
                first = first.deleteCharAt(0);
                --plen;
            }

            //remove all * and the preceding char 
            int i = 1;
            for(; i < plen; ++i){
                if(first.charAt(i) == '*'){
                    IndexChar next = new IndexChar(i - 1, first.charAt(i -1));
                    if(!indcha.empty()){
                        IndexChar in = indcha.pop();
                        if(!in.equal(next)){
                            indcha.push(in);
                            indcha.push(next);
                        }
                        else
                            indcha.push(in);
                    }
                    else
                        indcha.push(next);
                  
                    first = first.delete(i - 1, i + 1);
                    i = i - 2;
                    plen = plen - 2;
                }
            }

            if(isSame(s,first.toString()))
                isMatch = true;
            
            //dfs search
            checked.push(first);
            
            while(!isMatch && !indcha.empty()){
                Stack<StringBuffer> sbuf = new Stack<StringBuffer>();
                IndexChar inserted = indcha.pop();
                while(!checked.empty() && !isMatch){
                    StringBuffer st = checked.pop();
                    int ind = inserted.index;
                    char c = inserted.cha;
                    int length = st.length();
                    while(length < slen + 1){
                        StringBuffer cst = new StringBuffer(st.toString());
                        if(isSame(s, cst.toString())){
                            isMatch = true;
                            break;
                        }
                        else{
                            int len = length - ind;
                            if(isSame(s.substring(slen - len, slen), cst.toString().substring(ind, length)))
                                sbuf.push(cst);                        
                        }
                        st.insert(ind, c);
                        ++length;
                    }
                }
                checked = sbuf;
            }
        }
        return isMatch;
    }

    public static boolean isSame(String s, String p){
        int slen = s.length();
        int plen = p.length();
        boolean isSame = true;
        if(slen != plen)
            isSame = false;         
        else{
            for(int i = 0; i < slen; ++i)
                if(s.charAt(i) != p.charAt(i) && p.charAt(i) != '.'){
                    isSame = false;
                    break;
                }
        }
        return isSame;
    }
}

class IndexChar{
    int index;
    char cha;
    IndexChar(int i, char c){ 
        index = i; 
        cha = c;
    }
    boolean equal(IndexChar other){
        return index == other.index && cha == other.cha;
    }
}

  

转载于:https://www.cnblogs.com/averillzheng/p/3560449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值