每周一道算法題(十六)

本周題目的難度是‘EASY'所以為了追求效率婆芦,著實也是搞了好幾天喂饥,下面就來分享一下搞這題的心路歷程。员帮。。

題目:判斷一個由'(' ')' '{' '}' '[' ']' 組成的字符串是不是個合法的括號組氯材,比如"()" 和 "()[]{}"是合法的,但"(]"和"([)]"是不合法的

題目很簡單泡挺,我就不說思路了命浴,有小伙伴留言說題目下面不要直接出答案贱除,但我用markdown寫的,我也不知道該搞什么來占位置月幌,題目的字體我是放大的,看完大的字體自己就可以想想了捉兴,而且我的答案一般都不是最優(yōu)解录语,看完我的答案也可以想想能怎么優(yōu)化,下面先來看看我第一次寫的代碼(簡單注釋下):

bool isValid(char* s) {
    if (strlen(s) % 2 != 0) return false;
    int sum = 0,t = 0;
    //把傳進(jìn)來的字符串復(fù)制一遍
    char *temp = malloc(strlen(s) * sizeof(char));
    for (int i = 0; s[i] != '\0'; t = ++i) temp[i] = s[i];
    temp[t] = '\0';
    //開始遍歷
    for (int i = 0;temp[i] != '\0';i++) {
        sum -= 1;
        if (temp[i] == ')') {
            if (temp[i-1] == '(') {
                //如果')'前面是'(',就把'()'刪掉
                if (i+1 < strlen(temp)) {
                    for (int j = i-1; temp[j+2] != '\0'; t= ++j) temp[j] = temp[j+2];
                    temp[t] = '\0';
                    i >= 2 ? i -= 2 : i;
                }
            }else return 1;
        }else if (temp[i] == ']') {
            if (temp[i-1] == '[') {
                //如果']'前面是'[',就把'[]'刪掉
                if (i+1 < strlen(temp)) {
                    for (int j = i-1; temp[j+2] != '\0'; t = ++j) temp[j] = temp[j+2];
                    temp[t] = '\0';
                    i >= 2 ? i -= 2 : i;
                }
            }else return false;
        }else if (temp[i] == '}') {
            if (temp[i-1] == '{') {
                //如果'}'前面是'{',就把'{}'刪掉
                if (i+1 < strlen(temp)) {
                    for (int j = i-1; temp[j+2] != '\0'; t = ++j) temp[j] = temp[j+2];
                    temp[t] = '\0';
                    i >= 2 ? i -= 2 : i;
                }
            }else return false;
        }else sum += 2;
    }
    return sum ;
}

上面的代碼效率比較低,然后超時了蒲稳,卡在s長度為7000的時候,其實在Xcode上運行還是沒問題的(也就是思路沒問題)剩胁,但網(wǎng)頁上就沒通過祥国,然后就有了下面的代碼,這次的代碼就通過了(提示:')' - 1 = '('系宫,'}' - 2 = '{'']' - 2 = '['

bool isValid(char* s) {
    int sum = 0,t = 0,len = (int)strlen(s);
    if (len % 2 != 0) return false;
    for (int i = 0;i < len;i++) {
        sum -= 1;
        if (s[i] == ')') {
            t = i-1;
            while (s[t] == 0 && t >= 0) t--;
            if (s[t] == '(' && t >= 0) {
                s[t] = 0;
                s[i] = 0;
            }else return false;
        }else if (s[i] == ']' || s[i] == '}') {
            t = i-1;
            while (s[t] == 0 && t >= 0) t--;
            if (s[t] == s[i] - 2 && t >= 0) {
                s[t] = 0;
                s[i] = 0;
            }else return false;
        }else sum += 2;
    }
    return sum == 0 ? true : false;
}

這次的代碼雖然通過了椒惨,但是有兩個問題潮罪,第一個是效率比較低领斥,第二個是改變了參數(shù)沃暗,于是就想改怎么優(yōu)化優(yōu)化,于是有了下面的代碼嚼黔,下面的代碼非常高效惜辑,思想就是建立一個隊列,類似棧一樣碎节,進(jìn)棧出棧抵卫,t++就是push,t--就是pop

bool isValid(char* s) {
    int t = 0,len = (int)strlen(s);
    //如果s長度不是偶數(shù)介粘,直接返回false
    if (len % 2 != 0) return false;
    char *temp = malloc((len/2+1));
    for (int i = 0;i < len;i++) {
        if (s[i] == ')') {
            if (temp[t-1] == s[i] - 1) t--;
            else return false;
        }else if (s[i] == ']' || s[i] == '}') {
            if (temp[t-1] == s[i] - 2) t--;
            else return false;
        }else {
            temp[t] = s[i];
            t++;
        };
    }
    return t == 0 ? true : false; 
}

這是寫的效率最高的一個代碼了碗短,耗時0ms,超越99.11%的小伙伴偎谁,給自己贊一個,啊哈哈闰渔。铐望。。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品正蛙,歡迎轉(zhuǎn)載,轉(zhuǎn)載時請注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愚隧,一起剝皮案震驚了整個濱河市锻全,隨后出現(xiàn)的幾起案子录煤,更是在濱河造成了極大的恐慌荞胡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窖梁,居然都是意外死亡,警方通過查閱死者的電腦和手機纵刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門假哎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞍历,“玉大人,你說我怎么就攤上這事惧蛹⌒讨Γ” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵靠娱,是天一觀的道長。 經(jīng)常有香客問我像云,道長蚂夕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任侈贷,我火速辦了婚禮牍汹,結(jié)果婚禮上柬泽,老公的妹妹穿的比我還像新娘嫁蛇。我一直安慰自己,他們只是感情好睬棚,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布抑党。 她就那樣靜靜地躺著包警,像睡著了一般底靠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暑中,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天鳄逾,我揣著相機與錄音,去河邊找鬼雕凹。 笑死,一個胖子當(dāng)著我的面吹牛线欲,可吹牛的內(nèi)容都是我干的俄精。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嫌套,長吁一口氣:“原來是場噩夢啊……” “哼圾旨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹筛,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谣旁,沒想到半個月后滋早,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搁进,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年昔头,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莱革。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡讹开,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萧吠,到底是詐尸還是另有隱情桐筏,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布狰腌,位于F島的核電站牧氮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丹莲。R本人自食惡果不足惜尸诽,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望性含。 院中可真熱鬧,春花似錦叠萍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赫蛇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間落蝙,已是汗流浹背暂幼。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺嬉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓捐顷,卻偏偏與公主長得像雨效,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子徽龟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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