Implement regular expression matching with support for '.'
and '*'
.java
'.' 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") → trueexpress
原題連接編碼
必定要 仔細看題仔細看題prototype
這題能夠經過 動態規劃 解決,code
首先咱們能夠 定義個 boolean match[i][j]
表明 待匹配串s中從0...i的子串與原串0...就的子串的匹配結果 true
匹配成功 false
匹配失敗。遞歸
接下來就是動態規劃的流程了。ip
####case 1.一、 i == 0 && j == 0
當i=0
和 j=0
的時候 那麼 match[i][j] = true
這毫無疑問的 兩個空串匹配確定是 true
element
####case 1.二、i == 0 && j > 2 && p[j-2] == '*'
當leetcode
i == 0 && j > 2 && p[j-2] == '*' ; match[i][j] == match[i][j-2]
這爲何呢 由於直接我說過 .* 或者 a* 能夠匹配匹配任意個任意的字符 那麼就是說 s=""
跟 p=".*"
或者 p="a*"
是匹配值 爲何 .* 能夠匹配空字符get
i != 0 && j == 0
當i=0
和 j!=0
的時候 那麼 match[i][j] = false
由於待匹配串長度不爲0 可是原串長度是0 這是沒法匹配上的 因此是false
p[j] != '*"
match[i+1][j+1] = match[i][j] and (s[i] == p[j] or p[j] == '.' )
這種狀況最好理解就很少解釋。
p[j] == '*"
由於我以前說過 .*
a*
c*
是一體的
那麼它們能夠匹配0個或者1個或者多個字符
咱們一個一個分狀況考慮
a、 當前*匹配0個字符 match[i+1][j+1] = match[i+1][j-1]
舉慄 s="aaa" p="aaab*" ===> true b、 當前*匹配1個字符 match[i+1][j+1] = match[i][j-1] && (s[i] == p[j-1] || p[j-1] == '.')
舉慄 s="aa" p="a*" ===>true b、 當前*匹配多個字符
match[i+1][j+1] = match[i][j+1] && (s[i] == p[j-1] || p[j-1] == '.')
舉慄 s="aaaa" p="a*" ===>true
下面貼一下我leetocode ac的代碼
public static boolean isMatch(String s, String p) { boolean[][] match = new boolean[s.length() + 1][p.length() + 1]; match[0][0] = true; for (int i = 1; i < p.length(); i++) { if (p.charAt(i) == '*') { match[0][i + 1] = match[0][i - 1]; } } for (int i = 1; i < s.length() + 1; i++) { for (int j = 1; j < p.length() + 1; j++) { if (p.charAt(j - 1) != '*') { match[i][j] = match[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.'); } else if (p.charAt(j - 1) == '*') { // *匹配0個 match[i][j] = (match[i ][j - 2] // *匹配1個 || (match[i - 1][j - 2] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.')) // *匹配多個 || (match[i - 1][j] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.')) ); } } } return match[s.length()][p.length()]; }
其實這題也能夠用遞歸寫出來 可是時間複雜度是指數級 用dp的時間複雜度是O(n^2), 最後若是寫的有什麼不足之處歡迎指定。