java - 向我解释我在互联网上找到的这段代码?

标签 java

<分区>

我遇到了以下实现(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;
}

预先感谢您,一定会投票赞成/接受答案

最佳答案

问:为什么要在字符串长度上增加一个额外的长度?
A: 为了更清晰的代码。

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

问:dp[i][j] 不应该等于 true 吗?为什么要为前面的字符设置一个 boolean 值?
答:没有。这是因为我们不想在之前不匹配的情况下指示字符匹配。简单地说,如果输入的 3 个字符不匹配,则后面的任何内容都不应该标记为匹配。

问:不太了解以下检查的用途及其工作原理
A:如果字符与前一个字符不同,并且前一个模式字符不是具有特殊含义的点,则保持状态,因为我们可以进行 0 长度匹配。否则,只需继续朝三个可能的方向之一前进(看后面、上面或前面)。

关于java - 向我解释我在互联网上找到的这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398609/

相关文章:

java - 自定义 ActionBar 后退单击不起作用

java - 是 while( boolean 方法);不好的做法? (例子)

Java实现-SSL单向和双向握手切换

java - 使用 DocumentBuilder 解析 XML 文件时出现“MalformedURLException”

java - 这里需要空检查吗?

java - 没有正确填充数组 Java

java - 更改可执行 Jar 文件的图标

java - JSF 实用程序类

java - Minecraft ModLoader mod,私有(private)字段 netManager 的问题

java - 读取要在 JLabel 中显示的 "ImageIO.read"的图像路径