劍指Offer題目:正則表達式匹配

劍指Offer題目:正則表達式匹配

題目描述
請實現一個函數用來匹配包括'.''*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配


解題思路

使用遞歸的思想
每一步遞歸中都判斷模式的第2位字符是不是‘*’

  1. 是‘*’,繼續判斷字符當前位和模式當前位是否相等(包含模式位爲‘.’的情況)
    1.1 相等
    1.1.1 字符串下標不變,模式下標+2,代表匹配0次
    1.1.2 字符串下標+1,模式下標+2,代表匹配1次
    1.1.3 字符串下標+1,模式下標不變,代表匹配多次

    1.2 不相等則只有一種處理辦法:字符串下標不變,模式下標+2

  2. 不是‘*’,繼續判斷字符當前位和模式當前位是否相等(包含模式位爲‘.’的情況)
    2.1 不相等:直接返回false
    2.2 相等:則字符串下標+1,模式下標+1

終止條件:

  • 字符串還沒遍歷完,模式已遍歷完,則返回false;
  • 字符串和模式一起遍歷完,則返回true;

完整代碼

public class q53_match_正則表達式匹配 {
    private int slen;
    private int plen;

    public boolean match(char[] str, char[] pattern) {
        if ((str == null || str.length == 0) && (pattern == null && pattern.length == 0)) return true;
        this.slen = str.length;
        this.plen = pattern.length;
        return trace(str, 0, pattern, 0);
    }

    private boolean trace(char[] str, int sindex, char[] pattern, int pindex) {
        if (sindex == slen && pindex >= plen) return true;
        if (sindex < slen && pindex >= plen) return false;

        if (pindex + 1 < plen && pattern[pindex + 1] == '*') {
            //第二位字符是'*'
            if (sindex < slen && (str[sindex] == pattern[pindex] || pattern[pindex] == '.')) {
                return trace(str, sindex + 1, pattern, pindex + 2) || trace(str, sindex + 1, pattern, pindex)
                        || trace(str, sindex, pattern, pindex + 2);
            } else
                return trace(str, sindex, pattern, pindex + 2);
        } else {
             //第二位字符不是'*'
            if (sindex < slen && (str[sindex] == pattern[pindex] || pattern[pindex] == '.'))
                return trace(str, sindex + 1, pattern, pindex + 1);
            else
                return false;
        }
    }
}

更多LeetCode題目及答案解析見GitHub: https://github.com/on-the-roads/LeetCode
劍指offer題目及答案解析https://github.com/on-the-roads/SwordToOffer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章