【D30】反轉(zhuǎn)鏈表&正則表達(dá)式匹配 (LC 206&10 )

206. 反轉(zhuǎn)鏈表

問(wèn)題描述

反轉(zhuǎn)一個(gè)單鏈表囚玫。

解題思路1-迭代法

1)定義指向前一個(gè)節(jié)點(diǎn)的指針prev阱州,初始值為空
2)遍歷鏈表霎迫,將每個(gè)節(jié)點(diǎn)的next指針指向前驅(qū)節(jié)點(diǎn)。每次迭代過(guò)程如下:

  • 定義臨時(shí)變量temp悟泵,用于保存當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)


    step 1
  • 將當(dāng)前節(jié)點(diǎn)的next指針指向前驅(qū)節(jié)點(diǎn)


    step 2
  • 當(dāng)前節(jié)點(diǎn)成為下一個(gè)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)


    step 3
  • temp中的后繼節(jié)點(diǎn)成為下一個(gè)當(dāng)前節(jié)點(diǎn)


    step 4

代碼實(shí)現(xiàn)1-迭代法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        while(head != null){
            ListNode temp = head.next;
            head.next = prev;
            prev = head;
            head = temp;
        } 
        return prev;
    }
}
  • 時(shí)間復(fù)雜度O(n)
  • 空間復(fù)雜度O(1)

解題思路2-遞歸法

邊界情況:鏈表為空或者鏈表中只有一個(gè)結(jié)點(diǎn)(head == null || head.next == null)
遞歸函數(shù)實(shí)現(xiàn)功能:反轉(zhuǎn)鏈表找到newHead
遞歸參數(shù):head.next
遞歸執(zhí)行內(nèi)容:
head.next.next = head; //(對(duì)應(yīng)圖中節(jié)點(diǎn)2的next指向1)
head.next=null; //(對(duì)應(yīng)圖中節(jié)點(diǎn)1的next指向空)


image.png

代碼實(shí)現(xiàn)2-遞歸法

class Solution {
    public ListNode reverseList(ListNode head) {
        while(head == null || head.next == null){
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

  • 時(shí)間復(fù)雜度O(n)
  • 空間復(fù)雜度O(n),使用遞歸會(huì)使用隱式椀来ǎ空間蚣录。遞歸深度可能會(huì)達(dá)到 nn 層割择。

10. 正則表達(dá)式匹配

問(wèn)題描述

給你一個(gè)字符串 s 和一個(gè)字符規(guī)律 p,請(qǐng)你來(lái)實(shí)現(xiàn)一個(gè)支持 '.' 和 '*' 的正則表達(dá)式匹配萎河。

  • '.' 匹配任意單個(gè)字符
  • '*' 匹配零個(gè)或多個(gè)前面的那一個(gè)元素
  • 所謂匹配荔泳,是要涵蓋 整個(gè) 字符串 s的,而不是部分字符串虐杯。

解題思路

采用動(dòng)態(tài)規(guī)劃解題玛歌。

  • dp數(shù)組:dp[i][j]表示s中前i個(gè)字符和p中前j個(gè)字符能匹配
  • base case:分為三種情況。
    (1)s和p都為空串:一定能匹配
    (2)s不為空擎椰,p為空:一定不能匹配
    (3)s為空支子,p不為空:模式串為字母和*間隔排列且長(zhǎng)度為偶數(shù)時(shí)(如,*a*a*a*b*)能夠匹配空串达舒,其他的是都是false值朋。
  • 狀態(tài)轉(zhuǎn)移
    (1)如果p[j] != '*' , 則看s中第i個(gè)字符和p中第j個(gè)字符能否匹配。若不能匹配則dp[i][j] == false 休弃;若能匹配則取決dp[i-1[j-1]的值吞歼。
    (2)如果p[j] == '*' ,則看s中第i個(gè)字符和p中第j - 1個(gè)字符能否匹配圈膏。若不能匹配塔猾,則取決于dp[i][j-2]的值(沒(méi)有匹配,模式串中的a*被當(dāng)作空串)稽坤;若能匹配丈甸,則可能有三種情況dp[i][j] = dp[i-1][j] || dp[i][j - 1]|| dp[i][j - 2]

// = dp[i-1][j]糯俗,多個(gè)字符匹配,模式串中的a*被當(dāng)作aa...
// = dp[i][j-1]睦擂,單個(gè)字符匹配得湘,模式串中的a*被當(dāng)作a
// = dp[i][j-2],沒(méi)有匹配, 模式串中的a*被當(dāng)作空串

代碼實(shí)現(xiàn)

class Solution {
    public boolean isMatch(String s, String p) {
        int sLen = s.length(), pLen = p.length();
        //dp[i][j]表示s中前i個(gè)字符和p中前j個(gè)字符能匹配
        boolean[][] dp = new boolean[sLen + 1][pLen + 1];

        //base case
        // 1.兩個(gè)空串能夠匹配
        dp[0][0] = true;
        // 2.如果s不為空, p為空顿仇,則一定不能匹配
        for(int i = 1; i <= sLen; i++) {
            dp[i][0] = false;
        }
        // 3.如果s為空, p不為空淘正,*a*a*a*a*這種能夠匹配空串,其他的是都是false臼闻。
        //  奇數(shù)位不管什么字符都是false鸿吆,偶數(shù)位為* 時(shí)則: dp[0][j] = dp[0][j - 2]
        for(int j = 1; j <= pLen ; j++) {
            if(j % 2 == 0 && p.charAt(j - 1) == '*'){
                dp[0][j] = dp[0][j - 2];
            }else{
                dp[0][j] = false;
            }  
        }
        
        for(int i = 1; i <= sLen; i++){
            //si表示s中的第i個(gè)字符
            char si = s.charAt(i - 1);

            for(int j = 1; j <= pLen; j++){
                if(p.charAt(j - 1) != '*'){
                    dp[i][j] = dp[i - 1][j - 1] && match(si, p.charAt(j - 1));
                }else {
                    if(match(si, p.charAt(j - 2))){
                        //dp[i-1][j],多個(gè)字符匹配述呐,模式串中的a*被當(dāng)作aa... 
                        //dp[i][j-1]惩淳,單個(gè)字符匹配,模式串中的a*被當(dāng)作a
                        //dp[i][j-2], 沒(méi)有匹配, 模式串中的a*被當(dāng)作空串
                        dp[i][j] = dp[i-1][j] || dp[i][j - 1]|| dp[i][j - 2]; 
                    }else {
                        //沒(méi)有匹配乓搬,模式串中的a*被當(dāng)作空串
                        dp[i][j] = dp[i][j-2];
                    }
                }
            }
        }
        return dp[sLen][pLen];
    }

    //判斷兩個(gè)字符是否能夠匹配
    public boolean match(char s, char p){
        if(p == '.' || s == p){
            return true;
        }
        return false;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末思犁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子进肯,更是在濱河造成了極大的恐慌激蹲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坷澡,死亡現(xiàn)場(chǎng)離奇詭異托呕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)频敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)项郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斟赚,你說(shuō)我怎么就攤上這事着降。” “怎么了拗军?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵任洞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我发侵,道長(zhǎng)交掏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任刃鳄,我火速辦了婚禮盅弛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己挪鹏,他們只是感情好见秽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著讨盒,像睡著了一般解取。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上返顺,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天禀苦,我揣著相機(jī)與錄音,去河邊找鬼遂鹊。 笑死伦忠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稿辙。 我是一名探鬼主播昆码,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邻储!你這毒婦竟也來(lái)了赋咽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吨娜,失蹤者是張志新(化名)和其女友劉穎脓匿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宦赠,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陪毡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勾扭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毡琉。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妙色,靈堂內(nèi)的尸體忽然破棺而出桅滋,到底是詐尸還是另有隱情,我是刑警寧澤身辨,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布丐谋,位于F島的核電站,受9級(jí)特大地震影響煌珊,放射性物質(zhì)發(fā)生泄漏号俐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一定庵、第九天 我趴在偏房一處隱蔽的房頂上張望吏饿。 院中可真熱鬧践美,春花似錦、人聲如沸找岖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)许布。三九已至,卻和暖如春绎晃,著一層夾襖步出監(jiān)牢的瞬間蜜唾,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工庶艾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袁余,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓咱揍,卻偏偏與公主長(zhǎng)得像颖榜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煤裙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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