10. 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

一刷
题解:
用二维dp求解。dp[i][j], i表示str中的index, j表示pattern中的index
如果当前str和pattern字符可以匹配或者p[j] == '.', dp[i][j] = dp[i-1][j-1]
如果p[j] == '*',

  1. if str[i] != p[j-1] 且p[j-1] != '.', dp[i][j], dp[i][j] = dp[i][j-2](0 occurrence of p[j-1])
  2. else dp[i][j] = dp[i-1][j] || dp[i][j-1] || dp[i][j-2]
    其余情况为false
public class Solution {
    public boolean isMatch(String s, String p) {
        if(s == null || p == null) return false;
        boolean [][] dp = new boolean[s.length()+1][p.length()+1];
        
        dp[0][0] = true;
        for(int i=0; i<p.length(); i++){
            if(p.charAt(i) == '*' && i>0 && dp[0][i-1]) dp[0][i+1] = true;
        }
        
        for(int i=0; i<s.length(); i++){
            for(int j=0; j<p.length(); j++){
                if(p.charAt(j) == '.' || s.charAt(i) == p.charAt(j)) dp[i+1][j+1] = dp[i][j];
                if(p.charAt(j) == '*'){
                    if(p.charAt(j-1)!=s.charAt(i) && p.charAt(j-1)!='.'){
                        dp[i+1][j+1] = dp[i+1][j-1];//0 of the preceding element.
                    }
                    else{
                        dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);//one
                    }
                }
            }
        }
        return dp[s.length()][p.length()];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容