劍指offer 正規表示式匹配

2021-09-28 16:48:47 字數 1968 閱讀 5768

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

分四種情況考慮:

1.字串為空,模式串為空,–>匹配

2.字串為空,模式串不為空,需要對模式串進行判斷,如果模式串的長度是1,肯定匹配不成功;如果模式串類似於「.*」就會匹配成功

3.字串不為空,模式串為空, -->不匹配

4.字串不為空,模式串不為空,從後往前判斷,特別注意幾種特殊的情況:模式串由乙個"."和乙個"星號"組成時(意味著字串中可以是任意個任意字元),和所有的字串都匹配;星號前面的字元和當前位置的字串前的所有字元都匹配。

#include

using

namespace std;

bool

match

(char

* str,

char

* pattern)

else}}

else

else

else

if(pattern[j]

=='*'

)while

(str[i]

==pattern[j])if

(i<0)

//*前面的字元和str中的字元都匹配,「aaa」,"aa*"

return

true

; j--;}

else

if(pattern[j]

=='.'

)else}if

(i==-1

&&j==-1

)return

true

;else

return

false;}

}}intmain()

用遞迴實現

基本思想

依然是分成四種情況進行處理

1.str和模式串均為空時,返回true

2.str為空,模式串非空時,需要考慮pattern中第二個字元為*的情況,pattern後移兩位

3.str非空,模式為空時,返回false

4.均非空的時候,如果pattern的第二個字元為星號,需要分情況討論。

完整**

#include

using

namespace std;

//遞迴實現

bool

match

(char

* str,

char

* pattern)}if

(ls!=

0&&lp==0)

return

false;if

(ls!=

0&&lp!=0)

}else

else}}

}int

main()

二刷

遞迴思想:

class

solution

elseif(

strlen

(str)==0

)//兩串都不為空的情況if(

(str[0]

==pattern[0]

||pattern[0]

=='.'

)&&pattern[1]

!='*'

)else

else

else

if(str[0]

==pattern[0]

||pattern[0]

=='.'

)else

return

false;}

}}};

劍指offer 正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 abaca 匹配,但是與 aa.a 和 aba 均不匹配 由於只涉及兩種正規表示式的匹配,...

劍指Offer 正規表示式匹配

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

劍指offer 正規表示式匹配

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