**此題可以利用動態規劃法。因為它滿足應用動態規劃法的兩個必要條件,乙個是可以劃分為比較小的問題,使其容易求解;二是可以將答案重新組合起來形成最終的答案。
本題可以採用從後往前縮小和從前往後縮小範圍兩種。我採用了從後往前。
首先檢測string和pattern的最後一位。此時有三種情況:
pattern的最後一位為字母。這是一種簡單情況,只需要去使其和string最後一位作比較。若相同,則string和pattern將長度減1,繼續檢測之前的部分是否匹配,若不同,直接返回false。
pattern的最後一位為』.』。這也是一種簡單情況,只需要string還有字元去匹配就也可以分別將長度減1,繼續檢測。
pattern的最後一位為』*』。這種情況下,『*』需要分三種情況去看待。
1. 『*『前的元素匹配了0次。此時將string的下標上限不變,pattern的下標上限-2,略過』*』,繼續檢測。
2. 『*『前的元素匹配了1次。此時將string的下標上限減1,pattern的下標上限-2,略過』*』,繼續檢測。
3. '*'前的元素匹配了超過1次。此時將string的下標上限減1,pattern的下標上限不變,繼續檢測。
在加上一些邊界情況的判斷即可以寫出**了。
package q19;
public
class
solution
if(s.
length()
==0&& p.
length()
==0) char[
] schar = s.
tochararray()
; char[
] pchar = p.
tochararray()
;return
match
(schar, pchar, schar.length-
1, pchar.length-1)
;}public boolean match
(char[
] string, char[
] pattern, int sindex, int pindex)
//若字串未全部消除,模式已經全部消除,返回false
if(sindex >-1
&& pindex <=-1
)//若字串已全部消除,模式未全部消除,單獨考慮
if(sindex <=-1
&& pindex >-1
)//字串和模式都有剩餘的情況。
//若模式結尾是字母,檢測與字串結尾是否匹配,不匹配返回false,匹配則遞迴呼叫,index同時減1
if(pattern[pindex]
!='.'
&& pattern[pindex]
!='*'
)return
match
(string, pattern, sindex-
1, pindex-1)
;}//若模式結尾是'.',任意情況都可以index同時減1
if(pattern[pindex]
=='.')if
(pattern[pindex]
=='*'
)//若匹配不上,則視'*'為0次
else
}return
false;}
/** * 此函式檢測此段模式是否可以匹配空字串
* @param pattern 模式
* @param pindex 此段模式的下標上限
* @return 若能匹配空字串,返回true。若不能,返回false。
劍指Offer 19 正規表示式匹配
之前做這個題的時候特別凌亂,但這次會好很多,把思路分享出來,以及邊界的確定 思路 我們用倆個索引來控制字串和模式串已經匹配到達的位置,index1和index2,這個問題就難在有 的位置,我們需要考慮下乙個位置為 時候怎麼處理 1.模式串的index2下乙個位置為 1 字串的index1位置與模式串...
劍指offer19 正規表示式匹配
2.如果第二位是 第一位如果匹配,則三種情況 有一種為true,則結果為true 3.其餘情況一位一位比較 class solution s,pattern都是字串 defmatch self,s,pattern write code hereif len s 0 andlen pattern 0 ...
劍指offer 19 正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 ab a 表示b可以出現任...