leetcode【每日一题】44. 通配符匹配 Java

    技术2026-09-21  3

    题干

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

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

    说明:

    s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 示例 1:

    输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。

    示例 2:

    输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。

    示例 3:

    输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'

    示例 4:

    输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

    示例 5:

    输入: s = "acdcb" p = "a*c?b" 输出: false

    想法

    注释写的很详细了,难点在* *可以匹配空 可以匹配任意

    Java代码

    class Solution { public boolean isMatch(String s, String p) { /*用sp和pp分别纪录s和p当前要进行匹配的位置;match纪录s中匹配到的位置,用于让sp下次从这里开始;star纪录*出现的位置,pp从*的下一个位置出发。 */ int sp = 0; int pp = 0; int star = -1; int match = 0; while(sp < s.length()){ //当前p的字符和s相同或者是'?'那就是正常匹配 if(pp < p.length() &&(s.charAt(sp) == p.charAt(pp) || p.charAt(pp) == '?')){ sp++; pp++; }//当前p的字符是'*' 那么更新star的位置,更新match位置,pp++ else if(pp < p.length() && p.charAt(pp) == '*'){ star = pp; match = sp; pp++; }else if(star != -1){ //是*之前那么*可以匹配一切,更新即可 match++; sp = match; pp = star + 1; }else return false; } while(pp < p.length() && p.charAt(pp) == '*'){ //最后还有*进行更新,使其匹配空 pp++; } return p.length() == pp; } }

    我的leetcode代码已经上传到我的githttps://github.com/ragezor/leetcode

    Processed: 0.009, SQL: 9