劍指offer 面試題53 正規表示式匹配

2021-07-11 10:58:38 字數 867 閱讀 8155

題目:請實現乙個函式用來匹配包含'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(含0次)。在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"匹配,但與「aa.a"及"ab*a"均不匹配。

思路:我們從頭遍歷字串與模式,如果第乙個字串相等,那麼指標可能同時後移,也可能不移,問題在於模式的第二個字元是不是『*』。如果第乙個字元匹配,那麼對於指向字串的指標有兩種移動情況(1)第乙個字元與模式中的第乙個字元匹配,指向字串的指標向後移動一位。對於指向模式的指標,它有兩種情況,一種是繼續維持當前狀態,因為*前面的字母可以複製任意個,指標不移動;二是指標前面的字母複製0個,直接跳過子符'*',指標向後移動兩位;(2)雖然有第乙個字元與模式中的第乙個字元匹配,但由於模式中第二個字元是'*',它可以消除模式中的第乙個字元,這時候考慮的是與模式中'*'後面的字元是否匹配。例如字串aaa,模式a*aaa,雖然有a與模式的第乙個a匹配,但它實際上是和模式中'*'後面的a匹配的。

如果第乙個字元不匹配而且模式中第二個字元為『*』,那麼'*'前面的字元捨去不要,判斷與'*'後面的字元是否匹配。

對於模式中第二個字元不是'*'的情況,問題就簡單多了,只需要判斷第乙個字元是否匹配,如果匹配,判斷它們的下乙個字元是否匹配;不匹配,直接返回false。我們用遞迴的方法來解決這個問題。

bool match(char* str, char* pattern)

if(*str == *pattern || (*pattern == '.' && *str != '\0')

return matchcore(str+1, pattern+1);

return false;

}

劍指Offer 面試題53 正規表示式匹配

題目 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 思路 在比較匹配字串...

劍指offer 面試題53 正規表示式匹配

劍指offer 面試題53 正規表示式匹配 題目 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 abaca 匹配,但是與 aa.a 和 ...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...