1. 程式人生 > 資料庫 >SqlServer 建立索引進度查詢

SqlServer 建立索引進度查詢

又是以前寫過的題,現在相當於時覆盤。

給你一個字串s和一個字元規律p,請你來實現一個支援 '.'和'*'的正則表示式匹配。

'.' 匹配任意單個字元
'*' 匹配零個或多個前面的那一個元素
所謂匹配,是要涵蓋整個字串s的,而不是部分字串。

輸入:s = "aa" p = "a"fu
輸出:false
解釋:"a" 無法匹配 "aa" 整個字串。

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/regular-expression-matching

遇到字串相關的題,考慮動態規劃。如何定義base case,和狀態轉移方程呢?

對於s,p兩個字串,分別用兩個指標,i,j指向,dp[i][j]表示s[0...i]與p[0...j]是否匹配。dp[0][0]=true,兩個空串必然是匹配的。

我們分情況來討論,判斷當前符號是否匹配,如果匹配那麼p[i][j]=p[i-1][j-1],如果不匹配,就看看當前符號是不是'*',如果是’*‘則分情況討論。

為*,

1. p[j-1]!=s[i]&&dp[j-1]!='.' dp[i][j]=dp[i][j-2]

2.p[j-1]==s[i]||dp[j-1]=='.' dp[i][j]=dp[i][j-1] || dp[i-1][j] || dp[i][j-2]

dp[i][j]=dp[i][j-2]//不匹配

dp[i][j]=dp[i][j-1]//匹配一個

dp[i][j]=dp[i-1][j]//匹配多個

程式碼如下:

 1 class Solution {
 2 public:
 3     bool isMatch(string s, string p) {
 4         s=" "+s;//防止該案例:""\n"c*"
 5         p=" "+p;
 6         int m=s.size(),n=p.size();
 7         bool dp[m+1][n+1];
 8         memset(dp,false,(m+1)*(n+1));
 9         dp[0][0]=true;
10         for(int i=1;i<=m;i++){
11
for(int j=1;j<=n;j++){ 12 if(s[i-1]==p[j-1] || p[j-1]=='.'){ 13 dp[i][j]=dp[i-1][j-1]; 14 } 15 else if(p[j-1]=='*'){ 16 if(s[i-1]!=p[j-2] && p[j-2]!='.') 17 dp[i][j]=dp[i][j-2]; 18 else{ 19 dp[i][j]=dp[i][j-1] || dp[i][j-2] || dp[i-1][j]; 20 21 } 22 } 23 } 24 } 25 return dp[m][n]; 26 } 27 };