《剑指offer---面试题19:正则表达式匹配》

《剑指offer—面试题19:正则表达式匹配》
注明:仅个人学习笔记

package com.chapter3.code;

public class Solution
{
public boolean match(char[] str, char[] pattern)
{
// 如果字符串和模式有一个为空,则匹配失败
if (str == null || pattern == null)
{
return false;
}

    int strIndex = 0;
    int patternIndex = 0;

    return matchCore(str, strIndex, pattern, patternIndex);
}

public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex)
{
    // 有效性检验:str到尾,pattern到尾,匹配成功
    // 如果都匹配到了尾部,则说明匹配成功
    if (strIndex == str.length && patternIndex == pattern.length)
    {
        return true;
    }

    // pattern先到尾,匹配失败
    // 如果模式到了尾部,但字符串没匹配完,则匹配失败
    if (strIndex != str.length && patternIndex == pattern.length)
    {
        return false;
    }

    // 如果模式的第二个字符是*
    if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*')
    {
        // 当第一个字符匹配上了
        if ((str[strIndex] == pattern[patternIndex] && strIndex != str.length)
                || (pattern[patternIndex] == '.' && strIndex != str.length))
        {
            // a.字符串后移一个,模式后移两个(即*前的字符只出现一次)
            // abc a*bc
            // b.字符串后移一个,模式不变(即*前的字符肯出现多次)
            // aabc a*bc
            // c.字符串不变,模式后移两个(即*前的字符出现0次)
            // abc a*abc
            return matchCore(str, strIndex + 1, pattern, patternIndex + 2)
                    || matchCore(str, strIndex + 1, pattern, patternIndex)
                    || matchCore(str, strIndex, pattern, patternIndex + 2);
        } else// 如果第一个字符没匹配上,也就是*之前的出现0次,那模式就得从第三个字符开始(其实广义来说模式得从当前字符的后两个的位置开始)
        {
            return matchCore(str, strIndex, pattern, patternIndex + 2);
        }

    }

    // 当第一个字符匹配上,但模式的第二个字符不是*时,模式和字符串都后移一位
    if ((strIndex != str.length && pattern[patternIndex] == str[strIndex])
            || (pattern[patternIndex] == '.' && strIndex != str.length))
    {
        // 此时字符串和模式同时后移一位,即匹配下一位
        return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
    } else
    {
        return false;// 当第一个字符串没匹配上,此时直接失败
    }

}

}

猜你喜欢

转载自blog.csdn.net/u011296723/article/details/81674886