劍指 Offer 19 正則表示式匹配
阿新 • • 發佈:2022-02-10
hard題也要努力攻克!
動態規劃的思想,狀態轉移方程:長度為m與n的字串進行匹配,可以轉換為長度為m-1與n-1的字串進行匹配的結果&最後兩個字元進行匹配的結果
圖片引用自biliblili up主 香辣雞排蛋包飯
此時根據正則字串的最後一個元素來進行分類
-
若最後一個元素為字母或者 ' . ',則可以直接進行比較看是否相等,得到此時的狀態
-
若最後一個元素為 ' * ' ,表示前面的字母重複了N次,而且N>=0;
-
此時再對N的取值進行分類,當N=0和N>0時,兩者成立一個即可
N=0時,將字串的最後一位與正則字串的倒數第三個元素進行匹配
N>0時,將字串最後一位與正則字串重複的那個元素進行匹配
注意:動態規劃的狀態解釋為 字串的前 i 個元素與正則的前 j 個元素進行匹配的結果,dp [0] [0]表示兩者均為空的情況
class Solution { public static void main(String[] args) { String s = "aa"; String p = "a*"; Solution solution = new Solution(); solution.isMatch(s,p); } public boolean isMatch(String s, String p) {int m = s.length(); int n = p.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; ////這個條件需要放在前面,後面的初始化需要用到dp[0][0]=true 這個條件 for (int i = 1; i <= m; ++i) { dp[i][0] = false; } for (int i = 2; i <= n; i += 2) {if (p.charAt(i - 1) == '*') { dp[0][i] = dp[0][i - 2]; } else { dp[0][i] = false; } } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (p.charAt(j - 1) == '*') { if (dp[i][j - 2]) dp[i][j] = true; else if (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') { dp[i][j] = dp[i - 1][j]; } } else { if (p.charAt(j - 1) == '.') { dp[i][j] = dp[i - 1][j - 1]; } else if (p.charAt(j - 1) == s.charAt(i - 1)) { dp[i][j] = dp[i - 1][j - 1]; } } } } return dp[m][n]; } }