解释我在网上找到的这段代码给我?

问题描述:

我碰到下面的实现(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

问:为什么一个额外的长度添加到字符串的长度?
答:为了更清楚的代码。

问:什么是此检查的原因是什么?如果p在i = 3时具有'',它将简单地通过*
A:它代表:如果模式中的第一个字符与字符串中的第一个字符匹配,则将尽可能多的字符串标记为匹配。这是贪婪的做法。

问:不应该dp [i] [j]只是等于true?为什么要为前面的字符设置一个布尔值?
答:都能跟得上。这是因为如果以前的某些内容不匹配,我们不想表明该字符匹配。简而言之,如果输入的3个字符不匹配,则不应将其标记为匹配。

问:不安静的理解是什么下列检查是以及它们如何工作
答:如果角色从以前的一个不同,以前的模式字符不是具有特殊意义的点,保持状态,因为我们可以有0长度匹配。否则,继续沿着三个可能的方向之一继续前进(看后面,上面或前面)。