• leetcode 44 通配符匹配(dp)


    思路:

    思路一: 利用两个指针进行遍历。

    在代码里解释.

    时间复杂度为:O(mn)O(mn)O(mn)

    思路二: 动态规划

    dp[i][j]表示s到i位置,p到j位置是否匹配!

    初始化:

        dp[0][0]:什么都没有,所以为true
        第一行dp[0][j],换句话说,s为空,与p匹配,所以只要p开始为*才为true
        第一列dp[i][0],当然全部为False

    动态方程:

        如果(s[i] == p[j] || p[j] == "?") && dp[i-1][j-1] ,有dp[i][j] = true

        如果p[j] == "*" && (dp[i-1][j] = true || dp[i][j-1] = true) 有dp[i][j] = true

        ​ note:

        ​ dp[i][j-1],表示*代表是空字符,例如ab,ab*

        ​ dp[i-1][j],表示*代表非空任何字符,例如abcd,ab*



    class Solution {
        public boolean isMatch(String s, String p) {
            int sn = s.length();
            int pn = p.length();
            int i = 0;
            int j = 0;
            int start = -1;
            int match = 0;
            while (i < sn) {
                if (j < pn && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')) {
                    i++;
                    j++;
                } else if (j < pn && p.charAt(j) == '*') {
                    start = j;
                    match = i;
                    j++;
                } else if (start != -1) {
                    j = start + 1;
                    match++;
                    i = match;
                } else {
                    return false;
                }
            }
            while (j < pn) {
    //plan b
    class Solution {
        public boolean isMatch(String s, String p) {
            boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
            dp[0][0] = true;
            for (int j = 1; j < p.length() + 1; j++) {
                if (p.charAt(j - 1) == '*') {
                    dp[0][j] = dp[0][j - 1];
                }
            }
            for (int i = 1; i < s.length() + 1; i++) {
                for (int j = 1; j < p.length() + 1; j++) {
                    if (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') {
                        dp[i][j] = dp[i - 1][j - 1];
                    } else if (p.charAt(j - 1) == '*') {
                        dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
                    }
                }
            }
            return dp[s.length()][p.length()];
            
        }
    }
    
    
    
    if (p.charAt(j) != '*') return false;
                j++;
            }
            return true;
            
        }
    }
  • 相关阅读:
    Java中的toString、equals方法覆写,懒汉式单例模式,及异常处理
    【Java】String类、Object类、包装类总结
    Java接口练习
    Java面向对象测试
    【Java】二叉搜索树的实现操作及应用
    【Java】实现二叉树基本操作、面试题
    SAS--宏变量
    SAS--array
    SAS--do loop until while
    SAS--设置行号、标记
  • 原文地址:https://www.cnblogs.com/geck/p/11875486.html
Copyright © 2020-2023  润新知