Regular Expression Matching

Implement regular expression matching with support for '.' and ''.
'.' Matches any single character.
'
' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char s, const char p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a
") → true
isMatch("aa", ".
") → true
isMatch("ab", ".") → true
isMatch("aab", "c
ab") → true
思路:
用二維數(shù)組記錄保存的狀態(tài)dp[lens+1][lenp+1]
dp[0][0] = true表示都為空枚粘,這種情況應(yīng)該返回false
1.s[i] == p[i] dp[i+1][j+1] = dp[i][j]
2.p[j] == '.' dp[i+1][j+1] = dp[i][j]
3.p[j] == '
'
3.1.p[j-1] != '.' && p[j-1]!=s[i], dp[i+1][j+1] = dp[i+1][j-1] // a表示empty
3.2.
a:dp[i+1][j+1] = dp[i+1][j-1] // a
表示empty
b:dp[i+1][j+1] = dp[i][j+1] // a表示多個
c:dp[i+1][j+1] = dp[i+1][j] // a
表示一個欺抗,為什么是dp[i+1][j]---因為這個是最近的狀態(tài)
a,b,c取或设预,因為是一種情況蹬挤。
代碼:

public boolean isMatch(String s, String p) {        
if(s == null || p == null)return false;
    
    int lenS = s.length();
    int lenP = p.length();
    
    boolean[][] dp = new boolean[lenS + 1][lenP + 1];
    dp[0][0] = true;
    
    for(int j = 0;j < lenP;j++){
        if(p.charAt(j) == '*' && dp[0][j-1]){ // p.charAt(0) != '*'
            dp[0][j+1] = true;
        }
    }
    
    for(int i=0;i<lenS;i++){
        for(int j=0;j<lenP;j++){
            if('.' == p.charAt(j)){
                dp[i+1][j+1] = dp[i][j];
            }
            
            if(s.charAt(i) == p.charAt(j)){
                dp[i+1][j+1] = dp[i][j];
            }
            
            if(p.charAt(j) == '*'){
                if(p.charAt(j-1) != '.' && p.charAt(j-1) != s.charAt(i)){
                    dp[i+1][j+1] = dp[i+1][j-1]; // a*表示匹配空
                }else {
                    dp[i+1][j+1] = (dp[i][j+1] || dp[i+1][j] || dp[i+1][j-1]); // 分別代表多個, 一個和空惨缆。
                }
            }
        }
    }
    
    return dp[lenS][lenP];
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帐我,隨后出現(xiàn)的幾起案子叠洗,更是在濱河造成了極大的恐慌,老刑警劉巖蜜笤,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒蒋,死亡現(xiàn)場離奇詭異,居然都是意外死亡把兔,警方通過查閱死者的電腦和手機(jī)沪伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來县好,“玉大人围橡,你說我怎么就攤上這事÷乒保” “怎么了翁授?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵拣播,是天一觀的道長。 經(jīng)常有香客問我收擦,道長贮配,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任塞赂,我火速辦了婚禮泪勒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宴猾。我一直安慰自己圆存,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布仇哆。 她就那樣靜靜地躺著沦辙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讹剔。 梳的紋絲不亂的頭發(fā)上油讯,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音延欠,去河邊找鬼撞羽。 笑死,一個胖子當(dāng)著我的面吹牛衫冻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谒出,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼隅俘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笤喳?” 一聲冷哼從身側(cè)響起为居,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杀狡,沒想到半個月后蒙畴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡呜象,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年膳凝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恭陡。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹬音,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出休玩,到底是詐尸還是另有隱情著淆,我是刑警寧澤劫狠,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站永部,受9級特大地震影響独泞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苔埋,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一懦砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讲坎,春花似錦孕惜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓮栗,卻和暖如春削罩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背费奸。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工弥激, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愿阐。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓微服,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缨历。 傳聞我的和親對象是個殘疾皇子以蕴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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