给你一个字符串 s 和一个模式字符串 p ,其中 p 恰好 包含 一个 '*' 符号。

p 中的 '*' 符号可以被替换为零个或多个字符组成的任意字符序列。

如果 p 可以变成 s 的 子字符串,那么返回 true ,否则返回 false 。

示例 1:

输入:s = "leetcode", p = "ee*e"

输出:true

解释:

将 '*' 替换为 "tcod" ,子字符串 "eetcode" 匹配模式串。

示例 2:

输入:s = "car", p = "c*v"

输出:false

解释:

不存在匹配模式串的子字符串。

示例 3:

输入:s = "luck", p = "u*"

输出:true

解释:

子字符串 "u" ,"uc" 和 "uck" 都匹配模式串。

提示:

  • 1 <= s.length <= 50

  • 1 <= p.length <= 50

  • s 只包含小写英文字母。

  • p 只包含小写英文字母和一个 '*' 符号。

思路

  • 分别判断首* 字符,单独判断中*

  • 优化

代码

  • 分别判断首* 字符,单独判断中*

class Solution {
    public boolean hasMatch(String s, String p) {
        if (p.charAt(0) == '*') {
            return s.contains(p.substring(1));
        }
        if (p.charAt(p.length() - 1) == '*') {
            return s.contains(p.substring(0, p.length() - 1));
        }
        String[] split = p.split("\\*");
        if (!s.contains(split[0])) {
            return false;
        }
        return s.indexOf(split[0]) <= s.lastIndexOf(split[1]) - split[0].length();
    }
}
  • 优化

class Solution {
    public boolean hasMatch(String s, String p) {
        int len = p.length();
        if (p.charAt(0) == '*') {
            String suffix = p.substring(1);
            return s.indexOf(suffix) != -1;
        }
        if (p.charAt(len - 1) == '*') {
            String prefix = p.substring(0, len - 1);
            return s.indexOf(prefix) != -1;
        }
        int starIndex = p.indexOf('*');
        String prefix = p.substring(0, starIndex);
        String suffix = p.substring(starIndex + 1);
        int prefixPos = s.indexOf(prefix);
        int suffixPos = s.lastIndexOf(suffix);
        return prefixPos != -1 && suffixPos != -1 && prefixPos <= suffixPos - prefix.length();
    }
}