解題思路:採用遞迴的思路,比較複雜的點在於將所有的情況都要考慮到。首先因為p是模式串會出現正規表示式*
和.
,所以所有的情況我們都已模式串p為出發點。具體的情況可以用下面的流程圖表示:
按照流程圖可以寫出下面的**:
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool
: lens =
len(s)
lenp =
len(p)
if lenp ==0:
if lens ==0:
return
true
return
false
if lenp ==1:
if lens >
0and
(s[0
]== p[0]
or p[0]
=='.'):
return self.ismatch(s[1:
], p[1:
])return
false
else
:if p[1]
=='*'
:if lens >
0and
(s[0
]== p[0]
or p[0]
=='.'):
return self.ismatch(s, p[2:
])or self.ismatch(s[1:
], p)
return self.ismatch(s, p[2:
])else
:if lens >
0and
(s[0
]== p[0]
or p[0]
=='.'):
return self.ismatch(s[1:
], p[1:
])return
false
思路二:動態規劃,用dp[i][j]
表示s[i:]和p[j:]
是否匹配,然後可以根據s[i]和p[j]是否匹配以及p[j+1]是否為』*'得到不同的轉態轉移方程,**如下:
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool
: lenp =
len(p)
lens =
len(s)
dp =[[
false]*
(lenp +1)
for i in
range
(lens+1)
] dp[-1
][-1
]=true
for i in
range
(lens,-1
,-1)
:for j in
range
(lenp-1,
-1,-
1): first_match = i < lens and
(s[i]
== p[j]
or p[j]
=='.'
)if j +
1< lenp and p[j+1]
=='*'
:if first_match:
dp[i]
[j]= dp[i+1]
[j]or dp[i]
[j+2
]else
: dp[i]
[j]= dp[i]
[j+2
]else
: dp[i]
[j]= first_match and dp[i+1]
[j+1
]return dp[0][0]
面試題1 9月25日面試題
1.簡述http協議 2.請求頭都包含哪些東西?3.常用狀態碼都有哪些?4.django請求生命週期?5.如何自定義中介軟體 6.django怎麼執行原生sql語句 7.什麼是cbv和fbv?8.什麼是mtv框架 mvc框架?9.csrf攻擊原理 10.orm常用方法 11.簡述cookie和ses...
面試題19正規表示式匹配
題目 實現乙個函式用來匹配包含 和 的正規表示式,可以代表任意字母,表示他前面的字元可以出現 0次,includeusing namespace std bool matchcore char str,char pattern if str 0 pattern 0 if str 0 pattern ...
面試題19 正規表示式匹配
請實現乙個函式用來匹配包含 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 含0次 匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但與 aa.a 和 ab a 均不匹配。每次從字串裡拿出乙個字元和模式中的字元去...