leetcode 44 通配符匹配(dp)

人走茶凉 提交于 2019-12-04 17:29:38

思路:

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

在代码里解释.

时间复杂度为: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;
        
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!