【劍指Offer】正則表達式匹配(思路清晰)

題目重述:

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

思路:

首先看到這個題我們要考慮到用遞歸較容易,思路比較清晰。
(大家也可以嘗試非遞歸,說不定我後面會寫,用一個二維字符串組來存儲結果,可以試一下非遞歸,我估計有文章會寫這個題,也算是對動態規劃的練習)

1》》一說 到遞歸,我們先考慮出口:
(1)字符串str 和模式pattern都走到了最後的‘\0’處,說明全匹配,返回true.
(2)字符串str還未到’\0’處,但是pattern已經到了‘\0’處,說明不匹配,返回false。

現在我們考慮什麼時候該怎麼調用:(這塊參考牛客第一個java寫的經典思路)

2》》當模式中的第二個字符不是“*”時:

(1)如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。

(2)如果 字符串第一個字符和模式中的第一個字符相不匹配,說明存在不匹配項,直接返回false。

3》》而當模式中的第二個字符是 ‘※’ 時:

(1)如果字符串第一個字符跟模式第一個字符匹配,可能有3種匹配方式:
1>模式後移2字符,相當於x※被忽略;
2>字符串後移1字符,模式後移2字符;
(這個第二個方式,如果你看的比較懂,其實可以讓1>和3>組合代替,先3>再1> 就可代替2>。但是寫着的話,更清晰。)
3>字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;
(2)如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。

代碼

class Solution {
public:
    bool match(char* str, char* pattern)
    {
    	//出口(1)
        if (*str == '\0' && *pattern == '\0')
            return true;
        //出口(2)
        if (*str != '\0' && *pattern == '\0')
            return false;
        //當模式中的第二個字符不是“*”時;
        if (*(pattern + 1) != '*') {
            //(1)str與pattern匹配。
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str + 1, pattern + 1);
            //(2)str與pattern 有不匹配的項了,直接返回false。題目要求全匹配
            else
                return false;
        }
        //而當模式中的第二個字符是 ‘*’ 時
        else {
        //(1)如果字符串第一個字符跟模式第一個字符匹配,可能有3種匹配方式:
            if (*str == *pattern || (*str != '\0' && *pattern == '.'))
                return match(str, pattern + 2)||//1>模式後移2字符,相當於x※被忽略;
                match(str + 1, pattern + 2) || //2>字符串後移1字符,模式後移2字符;
                match(str + 1, pattern);//3>字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;

            //(2)如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。
            else
                return match(str, pattern + 2);
        }
    }
};

如果思路清晰,看懂了,可以點個贊再走。

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