給定乙個字串 (s) 和乙個字元模式 §。實現支援 『.』 和 『*』 的正規表示式匹配。
『.』 匹配任意單個字元。匹配應該覆蓋整個字串 (s) ,而不是部分字串。『*』 匹配零個或多個前面的元素。
說明:
示例 1:
輸入:s = 「aa」
p = 「a」
輸出: false
解釋: 「a」 無法匹配 「aa」 整個字串。
示例 2:
輸入:s = 「aa」
p = 「a*」
輸出: true
解釋: 『*』 代表可匹配零個或多個前面的元素, 即可以匹配 『a』 。因此, 重複 『a』 一次, 字串可變為 「aa」。
示例 3:
輸入:s = 「ab」
p = "."
輸出: true
解釋: 「.*」 表示可匹配零個或多個(』』)任意字元(』.』)。
示例 4:
輸入:s = 「aab」
p = 「c*a*b」
輸出: true
解釋: 『c』 可以不被重複, 『a』 可以被重複一次。因此可以匹配字串 「aab」。
示例 5:
輸入:s = 「mississippi」
p = 「mis*is*p*.」
輸出: false
思想
首先可以分為兩種情況**
class
solution
int i =0;
int j =0;
while
(i != s.
length()
&& j != p.
length()
)else
else
if(p.
charat
(j)==
'*'&&j>0)
}else
}else
if(j<
(p.length()
-1)&&p.
charat
(j+1)==
'*')
else}}
if(j<
(p.length()
)&&p.
charat
(j)==s.
charat
(i-1))
if(ilength()
||jlength()
)return
true;}
}
問題
大部分的字串都可以匹配,但是例如s=「aaa」,p="a*a"就不可以,因為j無法向後移動,如果s=「aaaaaa」,p=「a*aaa」,也無法得出正確的結論,因為無法判斷
*應該匹配幾個a。
官方給出的第乙個解法,類似於我自己的答案,也可以說是暴力法思想
設定乙個變數用於匹配第乙個字元,若匹配成功則置true,若不成功則置false
如果p的length>=2以及p的下乙個字元為"*",若上面的變數為false擷取p從兩位後開始,若上面變數為true,則擷取s從一位後開始,返回遞迴
若p的下乙個字元不為"*"以及變數為true,則擷取s和p一位後開始遞迴
**
class
solution
else
}}
思想
初始化陣列,dp[s.length()+1][p.length+1],用於儲存子問題結果
兩層迴圈,外面迴圈s,裡面迴圈p
第一次判斷,與上面的相同,看是否相等或者p為
「.」,記錄變數。
如果s的下乙個為"*",且記錄的變數為false,則記錄d[i][j]為d[i][j+2],若為true記錄為d[i+1][j]
如果不為"*",則直接記錄d[i][j]為d[i+1][j+1],遍歷完成返回dp[0][0]
**
class
solution
else}}
return dp[0]
[0];
}}
基本上所有的演算法判斷的思路都是一樣的,不同的是處理的方式,遞迴方式一般是不推薦使用的,不停的呼叫函式很浪費時間,而這個問題屬於比較典型的動態規劃,判斷完乙個字元判斷下乙個,而時間也比遞迴 要少得多。 正規表示式 匹配
字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...
正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...
正規表示式匹配
請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...