2017-06-06 50 views
2

我碰到下面的實現(https://discuss.leetcode.com/topic/40371/easy-dp-java-solution-with-detailed-explanation),但不安靜的理解它的工作原理如何 - 評論我怎麼迷路了:解釋我在網上找到的這段代碼給我?

boolean isMatch(String s, String p) { 
    if(s==null || p==null) { 
     return false; 
    } 

    // Why add an additional length to the string lengths? 
    boolean[][] dp = new boolean[s.length()+1][p.length()+1]; 
    dp[0][0] = true; 

      // What’s the reason for this check? If p were to have ‘*’ at i=3, it would simply pass 
    for(int i=0; i<p.length(); i++) { 
     if(p.charAt(i)=='*' && dp[0][i-1]) { 
      dp[0][i+1] = true; 
     } 
    } 

    for(int i=0; i<s.length(); i++) { 
     for(int j=0; j<p.length(); j++) { 

      // Shouldn’t dp[i][j] just equal to true? Why set a boolean value to characters ahead? 
      if(p.charAt(j)=='.') { 
       dp[i+1][j+1] = dp[i][j]; 
      } 

      // Same question as prior 
      if(p.charAt(j)==s.charAt(i)) { 
       dp[i+1][j+1] = dp[i][j]; 
      } 

      if(p.charAt(j)=='*') { 
       // Not quiet understanding what the following checks are for and how they work 
       if(p.charAt(j-1)!=s.charAt(i) && p.charAt(j-1)!='.') { 
        dp[i+1][j+1] = dp[i+1][j-1]; 
       } else { 
        dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]); 
       } 
      } 
     } 
    } 

    return true; 
} 

預先感謝您,並一定要投上/接受的答案

+1

我敢肯定你是如何丟失的是,一些塗料說_solve這riddle_接着就給出了基於語言的條件語句和數組的位置,即條件。 '如果p.charAt(J)== s.charAt(ⅰ):DP [i] [j] = DP [I-1] [j-1];'保持遠離這些盲目一無所知。 !花時間去完成一個目的,最終結果就是一些代碼。 – sln

回答

1

問:爲什麼一個額外的長度添加到字符串的長度?
答:爲了更清楚的代碼。

問:什麼是此檢查的原因是什麼?如果p在i = 3時具有'',它將簡單地通過*
A:它代表:如果模式中的第一個字符與字符串中的第一個字符匹配,則將盡可能多的字符串標記爲匹配。這是貪婪的做法。

問:不應該dp [i] [j]只是等於true?爲什麼要爲前面的字符設置一個布爾值?
答:都能跟得上。這是因爲如果以前的某些內容不匹配,我們不想表明該字符匹配。簡而言之,如果輸入的3個字符不匹配,則不應將其標記爲匹配。

問:不安靜的理解是什麼下列檢查是以及它們如何工作
答:如果角色從以前的一個不同,以前的模式字符不是具有特殊意義的點,保持狀態,因爲我們可以有0長度匹配。否則,繼續沿着三個可能的方向之一繼續前進(看後面,上面或前面)。