LeetCode44 萬用字元匹配

2021-08-25 11:53:25 字數 1371 閱讀 4047

題目描述:

給定乙個字串 (s) 和乙個字元模式 (p) ,實現乙個支援'?''*'的萬用字元匹配。

'?' 可以匹配任何單個字元。

'*' 可以匹配任意字串(包括空字串)。

兩個字串完全匹配才算匹配成功。

說明:

思路一:

字串p是模式字串,字串s是待匹配字串,使用p對s進行匹配。聯想到編輯距離那道題,使用兩個指標i和j,i指向字串s的第i個字元,j指向p的第j個字元,dp[i][j]=true表示字串s的前i個字元可以編輯成字串p的第j個字元,則存在三種情況,使dp[i][j]成立。

同理,萬用字元匹配這道題可以使用相同的思路,『?』可以看成對模式字串p進行一次變換操作,『*』匹配兩個或者兩個以上字元可以看成對模式字串p進行插入操作,『*』匹配乙個字元可以看成對p進行一次變換操作,『*』匹配0個字元可以看成對p進行一次刪除操作。使用dp[i][j]=true來表示s的前i個字元、p的前j個字元匹配成功,若dp[i][j]=true,則有三種可能:

dp[i-1][j-1]=true,且s.charat(i-1)==p.charat(j-1);

dp[i][j-1]=true,且p.charat(j-1)=='*',這時表示『*』匹配了0 個字元;

dp[i-1][j]=true,且p.charat(j-1)=='*',這時表示『*』匹配了s的第i個字元;

為了方便,字串的第乙個字元從1開始,**如下:

private static boolean ismatch(string s,string p) 

} }return dp[m][n];

}

思路二:

使用貪婪演算法。若模式字串p的第j個字元是『*』,則用 j_start=j,i_start=i 記錄此時『*』和字串s第i個字元的位置,然後跳到『*』的下乙個字元,從p的j+1處,s的i處開始,進行字元匹配(此時相當於『*』匹配了0 個字元);若發現無法完成匹配,則利用j_start i_start記錄的初始位置,從p的j+1處,s的i+1處進行匹配。。。如此迴圈下去,直到完成匹配。

**如下:

private static boolean ismatch(string s,string p)

else

} while(j與動態規劃相比,貪婪演算法的空間複雜度是o(1)。

leetcode。 44 萬用字元匹配

實現乙個支援 和 的萬用字元匹配。匹配任何單個字元。匹配任何數量的字元 包括0個 匹配應覆蓋 整個 輸入字串 而不是部分 這個函式原型為 bool ismatch const char s,const char p 示例 ismatch aa a false ismatch aa aa true i...

LeetCode 44 萬用字元匹配

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 示例 1 輸入 s aa p a 輸出 false解釋 a 無法匹配 aa 整個字串。示例 2 輸入 s aa p 輸出 true解釋 可以...

LeetCode44 萬用字元匹配

給定乙個字串 s 和乙個字元模式 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。這一題和leetcode10 很像,都是匹配問題,但是有乙個區別,此題裡面的 號並不依賴於前面的乙個字元,可以使用dp,思路參照leetcode44 ...