LeetCode 10. Regular Expression Matching

来源:互联网 发布:java 执行shell 编辑:程序博客网 时间:2024/05/16 03:14

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") → falseisMatch("aa","aa") → trueisMatch("aaa","aa") → falseisMatch("aa", "a*") → trueisMatch("aa", ".*") → trueisMatch("ab", ".*") → trueisMatch("aab", "c*a*b") → true

Subscribe to see which companies asked this question.


正则表达式判断,这个题一眼看上去就是dp问题,不过想要跑通还是挺复杂的,卡了很久才通过,在这里贴出代码以便复习:

public class Solution {    public boolean isMatch(String s, String p) {    //动态规划版本        if(s==null||p==null){            return false;        }        boolean[][]res = new boolean[s.length()+1][p.length()+1];   //动态规划表        res[0][0] = true;        for(int i=0;i<p.length();i++){                             //初始化第一行 s为空时 p各个长度的判断值            if(p.charAt(i)=='*'&&res[0][i-1]){                res[0][i+1] = true;            }        }        for(int i=0;i<s.length();i++){            for(int j=0;j<p.length();j++){                  if(s.charAt(i)==p.charAt(j)||p.charAt(j)=='.'){                  //当s[i]==p[j]或者p[j]=='.'直接看i-1,j-1的位置                    res[i+1][j+1] = res[i][j];                }                if(p.charAt(j)=='*'){                    if(s.charAt(i)!=p.charAt(j-1)&&p.charAt(j-1)!='.'){         //当p[j]=='*',如果前一个值和s[i]不等,则只有*取0的判断可能成立                        res[i+1][j+1] = res[i+1][j-1];                    }                    else{                        res[i+1][j+1] = res[i+1][j-1]||res[i+1][j]||res[i][j+1];  //p[j-1]==s[i]这时*可能是0,1,多个                    }                }            }        }        return res[s.length()][p.length()];    }}


0 0
原创粉丝点击