算法解題思路總結

算法解題思路:

  1. 細讀算法要求
  2. 找到極限狀況
  3. 找到臨界狀況,結果依賴
  4. 找到最終的結束求解點

編程實現:考慮算法的空間複雜度和時間複雜度java

案例說明:

題目:[Regular Expression Matching]算法

假設: 輸入字符串爲:s, 長度爲:slen, s的第i個字符到最後一個字符爲: s[i:];,s的第i個字符爲:s[i]; 匹配模式爲:p,長度爲:plen, p第j個字符到最後一個字符爲p[j:];p的第j個字符爲:p[j]; s[i:] 和 p[j:] 匹配結果爲: r[i][j]express

極限狀況編程

  1. s爲空,p爲空, 則匹配
  2. s不爲空,p=".*", 則匹配

臨界狀況數組

假設:code

  • r[slen][plen] = true
  • s[i:] 和 p[j:] 對比是匹配
  • 條件c1: s[i] 和 p[j] 對比: p[j] == "." || s[i]==p[j];
  • 條件c2: p[j+1]=="*"
  • 步驟1: 當 條件c1成立,則結果 r1: true,不然false
  • 步驟2:條件c2 成立,則:r[i][j] = r[i][j+2] || (r1 && r[i+1][j])
  • 步驟3: 條件c2不成立, 則 : r[i][j] = r1 && r[i+1][j+1]

結束求解點:

由於數組索引是從0開始算第一個字符的,因此 i=0而且j=0,則r[0][0] 爲最終的匹配結果索引

java 實現

class Solution {
    public boolean isMatch(String text, String pattern) {
        boolean[][] dp = new boolean[text.length() + 1][pattern.length() + 1];
        dp[text.length()][pattern.length()] = true;
        for (int i = text.length(); i >= 0; i--){
            for (int j = pattern.length() - 1; j >= 0; j--){
                boolean first_match = (i < text.length() &&
                                       (pattern.charAt(j) == text.charAt(i) ||
                                        pattern.charAt(j) == '.'));
                if (j + 1 < pattern.length() && pattern.charAt(j+1) == '*'){
                    dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
                } else {
                    dp[i][j] = first_match && dp[i+1][j+1];
                }
            }
        }
        return dp[0][0];
    }
}
相關文章
相關標籤/搜索