URL:https://leetcode.com/problems/regular-expression-matchingexpress
動態規劃。spa
'*' 匹配包括三種狀況:code
初始狀態也須要考慮:blog
public boolean isMatch(String s, String p) { boolean[][] dp = new boolean[s.length() + 1][p.length() + 1]; dp[0][0] = true; for (int i = 2; i <= p.length(); i += 2) { if (p.charAt(i - 1) == '*') dp[0][i] = true; else break; } for (int i = 1; i <= s.length(); i++) { for (int j = 1; j <= p.length(); j++) { if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.') { // . or other character satified s[i] = p[j] dp[i][j] = dp[i - 1][j - 1]; } else if (j >= 2 && p.charAt(j - 1) == '*') { // *, size = 1, size > 1 if (p.charAt(j - 2) == '.' || s.charAt(i - 1) == p.charAt(j - 2)) { dp[i][j] = dp[i - 1][j - 2] || dp[i - 1][j]; } // *, size = 0 dp[i][j] = dp[i][j] || dp[i][j - 2]; } } } return dp[s.length()][p.length()]; }
動態規劃,時間複雜度O(s.length * p.length),運行時間約爲 32 ms。leetcode
這個題目真的是難,動態規劃的題目沒有幾個是簡單的。曾經由於這個題目我放棄了刷 Leetcode,最近幾天苦心研究,終於得出答案了。這多是我最近最開心的一件事了。字符串
動態規劃最重要的一點是狀態轉移,只要能列出初始狀態,寫出狀態轉移方程,以後的問題就很好解決。io