算法学习记录(五十二)

121 阅读1分钟

问:

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

解: 1.

function isMatch(str1, str2) {
    function getRes(curI, curJ) {
        if (curJ === str2.length) {
            return curI === str1.length
        }
        // str2下一个字符不是*
        if (curJ + 1 === str2.length || str2[curJ + 1] !== '*') {
            if ( str2[curJ] === str1[curI] || str2[curJ] === '?') {
                return getRes(curI + 1, curJ + 1)
            } else {
                return false
            }
        }
        while (curI !== str1.length && (str2[curJ] === str1[curI] || str2[curJ] === '?')) {
            if (getRes(curI, curJ + 2)) {
                return true
            }
            curI++
        }
        return getRes(curI, curJ + 2)
    }
    return getRes(0, 0)
}