解释我在网上找到的这段代码给我?
问题描述:
我碰到下面的实现(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;
}
预先感谢您,并一定要投上/接受的答案
答
问:为什么一个额外的长度添加到字符串的长度?
答:为了更清楚的代码。
问:什么是此检查的原因是什么?如果p在i = 3时具有'',它将简单地通过*
A:它代表:如果模式中的第一个字符与字符串中的第一个字符匹配,则将尽可能多的字符串标记为匹配。这是贪婪的做法。
问:不应该dp [i] [j]只是等于true?为什么要为前面的字符设置一个布尔值?
答:都能跟得上。这是因为如果以前的某些内容不匹配,我们不想表明该字符匹配。简而言之,如果输入的3个字符不匹配,则不应将其标记为匹配。
问:不安静的理解是什么下列检查是以及它们如何工作
答:如果角色从以前的一个不同,以前的模式字符不是具有特殊意义的点,保持状态,因为我们可以有0长度匹配。否则,继续沿着三个可能的方向之一继续前进(看后面,上面或前面)。
我敢肯定你是如何丢失的是,一些涂料说_solve这riddle_接着就给出了基于语言的条件语句和数组的位置,即条件。 '如果p.charAt(J)== s.charAt(ⅰ):DP [i] [j] = DP [I-1] [j-1];'保持远离这些盲目一无所知。 !花时间去完成一个目的,最终结果就是一些代码。 – sln