44. 通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wildcard-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

动态规划

import java.util.Scanner;

class Solution {

    private boolean isValid(String s, String p) {
        for (int i = 0; i < s.length(); ++i) {
            if (s.charAt(i) == '?' || s.charAt(i) == '*') {
                return false;
            }
        }
        return true;
    }

    public boolean isMatch(String s, String p) {
        if (p == null || p.length() == 0) {
            return s == null || s.length() == 0;
        }

        if (!isValid(s, p)) {
            return false;
        }

        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
        dp[0][0] = true;
        int index = 0;
        while (index < p.length() && p.charAt(index) == '*') {
            dp[0][index + 1] = true;
            index++;
        }

        for (int i = 1; i <= s.length(); ++i) {
            for (int j = 1; j <= p.length(); ++j) {
                if (p.charAt(j - 1) == '*') {
                    dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?');
                }
            }
        }

        return dp[s.length()][p.length()];
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().isMatch(in.next(), in.next()));
        }
    }
}

贪心

import java.util.Scanner;

class Solution {

    private boolean equal(char a, char b) {
        return a == b || b == '?';
    }

    private boolean allStars(String p, int left, int right) {
        while (left <= right) {
            if (p.charAt(left) != '*') {
                return false;
            }
            left++;
        }
        return true;
    }

    public boolean isMatch(String s, String p) {
        int sRight = s.length() - 1, pRight = p.length() - 1;

        while (sRight >= 0 && pRight >= 0 && p.charAt(pRight) != '*') {
            if (!equal(s.charAt(sRight), p.charAt(pRight))) {
                return false;
            }
            --sRight;
            --pRight;
        }

        if (pRight == -1) {
            return sRight == -1;
        }

        int sLeft = 0, pLeft = 0;
        int sMark = -1, pMark = -1;
        while (sLeft <= sRight && pLeft <= pRight) {
            if (p.charAt(pLeft) == '*') {
                ++pLeft;
                sMark = sLeft;
                pMark = pLeft;
            } else if (equal(s.charAt(sLeft), p.charAt(pLeft))) {
                sLeft++;
                pLeft++;
            } else if (sMark != -1) {
                sLeft = ++sMark;
                pLeft = pMark;
            } else {
                return false;
            }
        }
        return allStars(p, pLeft, pRight);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().isMatch(in.next(), in.next()));
        }
    }
}
posted @ 2021-12-15 11:05  Tianyiya  阅读(44)  评论(0)    收藏  举报