正則表達式匹配

在牛客網上做劍指offer的習題,這個題感覺有些問題
題目描述
請實現一個函數用來匹配包括’.’和’‘的正則表達式。模式中的字符’.’表示任意一個字符,而’‘表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串”aaa”與模式”a.a”和”ab*ac*a”匹配,但是與”aa.a”和”ab*a”均不匹配


錯誤代碼1:

bool match(char *str, char* pattern){
    if (pattern[0] == 0 && str[0] == 0){
        return true;
    }
    //當有a*出現
    if (pattern[0] != 0 && pattern[1] == '*')
        //a字符匹配
        if (pattern[0] == str[0])
            return match(str + 1, pattern);
        else
        //a字符不匹配
            return match(str, pattern + 2);
    //兩個字符相等
    if (pattern[0] == '.'&&str[0] || pattern[0] == str[0])
            return match(str + 1, pattern + 1);
    return false;

}

測試用例1: “a”,”.*”
expect:true
output:false
原因:匹配a*時未考慮a=’.’,’.’可以匹配任何字符


然後修改程序如下:
錯誤代碼2:

//當有a*出現
    if (pattern[0] != 0 && pattern[1] == '*')
        //a字符匹配
        if (pattern[0] == str[0]||pattern[0]=='.'&&str[0])
            return match(str + 1, pattern);

測試用例2:“aaaa”,”a*a”
expect:true
output:false
原因:
a*匹配了目標表達式所有的字符串,導致正則表達式剩餘一個a無法與目標表達式匹配
修改:檢測相對應位置字符串相等後應該有兩種做法,一是匹配一個二是不匹配,錯誤代碼忘記不匹配的情況


修改後,測試通過,但是存疑,就是這個正則表達式”.*”,
AC代碼(存疑)

 bool match(char *str, char* pattern){
    if (pattern[0] == 0 && str[0] == 0){
        return true;
    }
    //當有a*出現
    if (pattern[0] != 0 && pattern[1] == '*'){
        if (pattern[0] == str[0] || pattern[0] == '.'&&str[0]){

                return match(str, pattern + 2)||match(str + 1, pattern);
        }
        else
            return match(str, pattern + 2);

    }
    if (pattern[0] == '.'&&str[0] || pattern[0] == str[0])
            return match(str + 1, pattern + 1);
    return false;

}

測試用例3:”bcbbabab”,”.*”
expect: true(我認爲是false)
output:false
“.*”變成了萬能匹配,什麼輸入都能匹配感覺不對

修改了一下,把”.* “單獨拎出來分情況討論,終碼如下,但是不能通過牛客網劍指0ffer的測試系統,因爲測試用例”.*”是全部匹配,比較存疑。

終碼

bool match(char *str, char* pattern){
    if (pattern[0] == 0 && str[0] == 0){
        return true;
    }
    //當有a*出現
    if (pattern[0] != 0 && pattern[1] == '*'){
        if (pattern[0] == str[0]){

            return match(str, pattern + 2) ||match(str + 1, pattern);
        }
        else if (pattern[0] == '.'&&str[0]){
            if (match(str, pattern + 2))
                return true;
            else{
            if (str[0] == str[1])
                return match(str + 1, pattern);
            else
                return match(str + 1, pattern + 2);
             }
        }
        else
            return match(str, pattern + 2);

    }
    if (pattern[0] == '.'&&str[0] || pattern[0] == str[0])
        return match(str + 1, pattern + 1);
    return false;

}
發佈了39 篇原創文章 · 獲贊 2 · 訪問量 8915
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章