1. 程式人生 > 其它 >劍指 Offer 19 正則表示式匹配

劍指 Offer 19 正則表示式匹配

hard題也要努力攻克!

解題思路分析

動態規劃的思想,狀態轉移方程:長度為m與n的字串進行匹配,可以轉換為長度為m-1與n-1的字串進行匹配的結果&最後兩個字元進行匹配的結果

圖片引用自biliblili up主 香辣雞排蛋包飯

此時根據正則字串的最後一個元素來進行分類

  1. 若最後一個元素為字母或者 ' . ',則可以直接進行比較看是否相等,得到此時的狀態

  2. 若最後一個元素為 ' * ' ,表示前面的字母重複了N次,而且N>=0;

  3. 此時再對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]; } }