lintcode-通配符匹配

時(shí)間復(fù)雜度O(mn),dp[i][j] 代表字符串s的前i個(gè)字符和字符串p的前j個(gè)字符是否匹配,可以匹配兩個(gè)字符串均包含通配符的情況

class Solution {
public:
    /**
     * @param s: A string 
     * @param p: A string includes "?" and "*"
     * @return: A boolean
     */
    bool isMatch(const char *s, const char *p) {
    // write your code here
    
    if(s == NULL && p == NULL){
        return true;
    }
    
    if(s == NULL || p == NULL){
        return false;
    }
        
    
    int sl = (int)strlen(s);
    int pl = (int)strlen(p);
    //bool dp[][] = new bool[sl+1][pl+1];
    bool dp[sl+1][pl+1];
    for(int i = 1; i <= sl; ++i){
        for(int j = 1; j <= pl; ++j){
            dp[i][j] = false;
        }
    }
    dp[0][0] = true;
    for(int i = 1; i <= sl; ++i){
        if(dp[i-1][0] == true && s[i-1] == '*'){
            dp[i][0] = true;
        }else{
            dp[i][0] = false;
        }
    }
    
    for(int i = 1; i <= pl; ++i){
        if(dp[0][i-1] == true && p[i-1] == '*'){
            dp[0][i] = true;
        }else{
            dp[0][i] = false;
        }
    }
    
    for(int i = 1; i <= sl; ++i){
        for(int j = 1; j <= pl; ++j){
            if(s[i-1] == '*' || p[j-1] == '*'){
                dp[i][j] = dp[i-1][j] || dp[i][j-1];
            }else if(s[i-1] == '?' || p[j-1] == '?'){
                dp[i][j] = dp[i-1][j-1];
            }else {
                dp[i][j] = ((s[i-1] == p[j-1] ? true : false) && dp[i-1][j-1]);
            }
            
        }
    }
    
   // cout << dp[sl-1][pl-1] << endl;
    
    return dp[sl][pl];
}
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 判斷兩個(gè)可能包含通配符“?”和“*”的字符串是否匹配。匹配規(guī)則如下: '?' 可以匹配任何單個(gè)字符。'*' 可以匹...
    六尺帳篷閱讀 808評(píng)論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,769評(píng)論 0 33
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,327評(píng)論 0 18
  • 個(gè)人學(xué)習(xí)批處理的初衷來(lái)源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過(guò)程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,779評(píng)論 0 11
  • 東野圭吾 這本書(shū)其實(shí)看至接近于尾聲時(shí) 我依舊不懂 殺死花岡靖子的前夫富樫慎二的那天晚...
    冬似舊山閱讀 304評(píng)論 0 0