【字符串 递归】正则表达式匹配

题目描述

请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配
示例1
输入
“aaa”,“a*a”
返回值
true


首先需要弄清楚题目意思,匹配是指字符串中的所有字符要匹配整个模式串,即两个串都要匹配到尾部。思路是递归遍历字符串和模式串,判断当前字符串和模式串是否匹配,其中*要和其上一个字符串一起考虑,因此存在以下情况:

  • 模式串下一个字符是*
    • 当前字符串和模式串不匹配,则*的作用是将模式串的字符抵消,即出现0次,此时字符串指针不动,模式串指针+2,跳过`*``
    • 若当前模式串和字符串匹配,或者模式串为.,则*可能匹配多次或者0次,因此存在两种情况,匹配多次时,字符串指针+1,模式串不动,即_match(str, s + 1, pattern, p),匹配0次时,字符串指针不动,模式串+2跳过*。需要注意前提是字符串指针不能越界,即s < str.length(),字符串指针才能继续往下走。
  • 下一个字符不是*
    • 若模式串和字符串匹配,或者模式串为.,则字符串和模式串共同前进,同样需要注意字符串指针不能越界,即s < str.length()
    • 否则返回false,匹配失败
public class Solution {
    
    
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param str     string字符串
     * @param pattern string字符串
     * @return bool布尔型
     */
    public boolean _match(String str, int s, String pattern, int p) {
    
    
        if (s == str.length() && p == pattern.length()) return true;
        if (p == pattern.length()) return false; // 字符串未匹配完,模式串已经完了
        if ((p + 1) < pattern.length() && pattern.charAt(p + 1) == '*') {
    
    
            // 模式串下一个字符是*
            if (s < str.length() && (str.charAt(s) == pattern.charAt(p) || pattern.charAt(p) == '.'))
                return _match(str, s + 1, pattern, p) || _match(str, s, pattern, p + 2);  // *匹配多次 或 匹配一次
            else
                return _match(str, s, pattern, p + 2); // *的作用是将其抵消
        } else {
    
    
            if (s < str.length() && (str.charAt(s) == pattern.charAt(p) || pattern.charAt(p) == '.'))
                return _match(str, s + 1, pattern, p + 1); // 匹配,两指针前进
            else
                return false;
        }
    }

    public boolean match(String str, String pattern) {
    
    
        // write code here
        return _match(str, 0, pattern, 0);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43486780/article/details/114378357