算法真題-騰訊-壓縮算法(1)

今天刷到了一題騰訊的算法真題构蹬,覺(jué)得比較有趣王暗,所以在這里和大家分享一下。本題的鏈接是:壓縮算法

題目

小Q想要給他的朋友發(fā)送一個(gè)神秘字符串庄敛,但是他發(fā)現(xiàn)字符串的過(guò)于長(zhǎng)了俗壹,于是小Q發(fā)明了一種壓縮算法對(duì)字符串中重復(fù)的部分進(jìn)行了壓縮,對(duì)于字符串中連續(xù)的m個(gè)相同字符串S將會(huì)壓縮為[m|S](m為一個(gè)整數(shù)且1<=m<=100)藻烤,例如字符串ABCABCABC將會(huì)被壓縮為[3|ABC]策肝,現(xiàn)在小Q的同學(xué)收到了小Q發(fā)送過(guò)來(lái)的字符串,你能幫助他進(jìn)行解壓縮么隐绵?

輸入

輸入第一行包含一個(gè)字符串s,代表壓縮后的字符串拙毫。
S的長(zhǎng)度<=1000;
S僅包含大寫(xiě)字母依许、[、]缀蹄、|;
解壓后的字符串長(zhǎng)度不超過(guò)100000;
壓縮遞歸層數(shù)不超過(guò)10層;

輸出

輸出一個(gè)字符串峭跳,代表解壓后的字符串。

輸入例子

HG[3|B[2|CA]]F

輸出例子

HGBCACABCACABCACAF

例子說(shuō)明

HG[3|B[2|CA]]F?>HG[3|BCACA]F?>HGBCACABCACABCACAF

題目分析

這題是一個(gè)字符串操作類型的題目缺前,問(wèn)題的難點(diǎn)在于中括號(hào)的范圍不確定蛀醉,中括號(hào)也能放其他的中括號(hào),所以我們要從最里面的中括號(hào)開(kāi)始衅码,一層一層剝開(kāi)拯刁,舉例說(shuō)明:上面的例子[3|B[2|CA]],我們很難將[3|*]直接展開(kāi)逝段,這樣會(huì)導(dǎo)致有更多的中括號(hào)[B[2|CA]B[2|CA]B[2|CA]]垛玻,從而使問(wèn)題更加復(fù)雜,就像例子說(shuō)明1里面講到的奶躯,要先從[2|CA]開(kāi)始展開(kāi)帚桩,這樣才能使得中括號(hào)個(gè)數(shù)越來(lái)越少?gòu)亩鉀Q問(wèn)題。

解題思路

思路是在遍歷字符串的過(guò)程中嘹黔,利用一個(gè)堆棧账嚎,存儲(chǔ)"[""|"的位置,當(dāng)遇到"]"時(shí),他必定與堆棧最上面的"[""|"匹配郭蕉,可以將他們出棧疼邀,然后用到"[""]"中間的值去替換待返回的字符串

代碼

public static void main(String args[]){
//        用戶輸入
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
//        用StringBuilder存儲(chǔ)結(jié)果,一般字符串的拼接都用它恳不,而不是String
        StringBuilder result = new StringBuilder();
//        用堆棧存儲(chǔ)[和|的下標(biāo)
        Stack<Integer> stack = new Stack<>();
        int right = 0;
        for(char ch:s.toCharArray()){
            result.append(ch);
            if(ch == '[' || ch == '|')
                stack.push(right);
//            當(dāng)前的字符是]檩小,就可以將堆棧里面的[和|彈出來(lái)了
            if(ch == ']'){
                if(stack.size() >= 2){
                    int shuhao = stack.pop();
                    int zuokuohao = stack.pop();

//                    將[geshu|st]轉(zhuǎn)變成字符串的形式
                    String st = result.substring(shuhao+1, right);
                    int geshu = Integer.parseInt(result.substring(zuokuohao+1,shuhao));
                    StringBuilder dangqian = new StringBuilder();
                    while(geshu-->0){
                        dangqian.append(st);
                    }
//                    將轉(zhuǎn)換后的字符串變?yōu)榻Y(jié)果的一部分
                    result.replace(zuokuohao,right+1,dangqian.toString());
//                    right下標(biāo)指向當(dāng)前result的最后一個(gè)字符
                    right = zuokuohao + dangqian.length() - 1;
                }else{
                    System.out.println("您的輸入錯(cuò)誤!Q萄规求!");
                }
            }
            right++;

        }
        if(!stack.isEmpty())
            System.out.println("不是對(duì)的哦!B训搿阻肿!");
        System.out.println(result.toString());
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沮尿,隨后出現(xiàn)的幾起案子丛塌,更是在濱河造成了極大的恐慌,老刑警劉巖畜疾,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴邻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡啡捶,警方通過(guò)查閱死者的電腦和手機(jī)姥敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瞎暑,“玉大人彤敛,你說(shuō)我怎么就攤上這事×硕模” “怎么了墨榄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勿她。 經(jīng)常有香客問(wèn)我袄秩,道長(zhǎng),這世上最難降的妖魔是什么嫂拴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任播揪,我火速辦了婚禮,結(jié)果婚禮上筒狠,老公的妹妹穿的比我還像新娘猪狈。我一直安慰自己,他們只是感情好辩恼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布雇庙。 她就那樣靜靜地躺著谓形,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疆前。 梳的紋絲不亂的頭發(fā)上寒跳,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音竹椒,去河邊找鬼童太。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胸完,可吹牛的內(nèi)容都是我干的书释。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赊窥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爆惧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锨能,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扯再,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后址遇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體熄阻,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年倔约,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饺律。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跺株,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脖卖,到底是詐尸還是另有隱情乒省,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布畦木,位于F島的核電站袖扛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏十籍。R本人自食惡果不足惜蛆封,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勾栗。 院中可真熱鬧惨篱,春花似錦、人聲如沸围俘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至簿寂,卻和暖如春漾抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背常遂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工纳令, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克胳。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓平绩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毯欣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馒过,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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