一段动态规划代码赏析

简介: 输入一个字符串 和 一个pattern. 返回结果是否匹配上

输入一个字符串 和 一个pattern.  返回结果是否匹配上

    public static boolean isMatch(String str, String strPattern) {
        int countXing = 0;
        for (char c : strPattern.toCharArray())
            countXing++;
        if (strPattern.length() - countXing > str.length()) //说明s2去掉通配符,长度也长于s1
            return false;
        //动态规划设置初值
        boolean[][] dp = new boolean[strPattern.length() + 1][str.length() + 1];
        dp[0][0] = true;
        for (int i = 1; i <= strPattern.length(); i++) {
            char s2_char = strPattern.charAt(i - 1);
            dp[i][0] = dp[i - 1][0] && s2_char == '*'; //设置每次循环的初值,即当星号不出现在首位时,匹配字符串的初值都为false
            for (int j = 1; j <= str.length(); j++) {
                char s1_char = str.charAt(j - 1);
                if (s2_char == '*')
                    dp[i][j] = dp[i - 1][j] || dp[i][j - 1]; //动态规划递推式(星号) 表示星号可以匹配0个(决定于上次外循环的结果)或者多个(决定于刚才内循环的结果)
                else
                    dp[i][j] = dp[i - 1][j - 1] && (s2_char == '?' || s1_char == s2_char); //动态规划递推式(非星号) 表示dp值取决于上次的状态和当前状态
            }
        }
        return dp[strPattern.length()][str.length()];
    }
目录
打赏
0
0
0
0
49
分享
相关文章
递归的递归之书:第十章到第十四章
递归的递归之书:第十章到第十四章
72 0
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
代码随想录 Day26 贪心算法01 中 LeetCode T376 摆动序列
76 1
第五章 多维数组和广义表【数据结构与算法】【精致版】
第五章 多维数组和广义表【数据结构与算法】【精致版】
158 0
编译原理复习五:属性文法与三地址码的生成(附题目与答案 超详细)
编译原理复习五:属性文法与三地址码的生成(附题目与答案 超详细)
653 0
|
11月前
|
回溯算法练习题
回溯算法练习题
60 0
C++006-C++分支结构练习题
C++006-C++分支结构练习题
代码随想录Day20 回溯算法 LeetCode77 组合问题
代码随想录Day20 回溯算法 LeetCode77 组合问题
49 0

热门文章

最新文章

相关实验场景

更多