牛客——最長子字符串

1. 02最長子字符串

題目

牛牛有兩個(gè)字符串(可能包含空格),牛牛想找出其中最長的公共連續(xù)子串,希望你能幫助他,并輸出其長度。
例如:A = 4 B = 0 K = 30000 -> 1110 -> 1001 -> 0100 -> 1111

思路

動(dòng)態(tài)規(guī)劃。

兩個(gè)字符串從1增長到各自的長度。
memo[i][j]中記錄著,兩個(gè)字符串分別為i,j時(shí)的子字符串長度。
如果某個(gè)下標(biāo)對(duì)應(yīng)字符相同,那么memo[i][j]等于其memo[i-1][j-1]+1,也就是斜上一個(gè)+1。
否則,選取上面和前面中最大的(因?yàn)檫@兩個(gè)能增加到當(dāng)前兩個(gè)字符串,如果不同必然和上一個(gè)字符串的最長子字符串長度相同)。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

string commonStr(string &l,string &r)
{
    int llen=l.size();
    int rlen=r.size();
    //memo[i][j]中存儲(chǔ)的是:第一個(gè)字符串長i,第二個(gè)長j時(shí)
    //最長公共子字符串。
    vector<vector<int>> memo(llen+1,vector<int>(rlen+1,0));
    vector<vector<int>> memoPath(llen+1,vector<int>(rlen,0));
    
    memo[0][0]=0;
    
    for(int li = 1;li<=llen;li++)
    {
        for(int ri = 1;ri<=rlen;ri++)
        {
            //當(dāng)某個(gè)字符相等時(shí),標(biāo)記字符串長度比之前的+1;
            if(l[li-1]==r[ri-1])
            {
                memo[li][ri]=memo[li-1][ri-1]+1;
                memoPath[li][ri]=1;
            //當(dāng)不同時(shí),選取,能夠達(dá)到ij長度的兩條子字符串的最長長度
            //(i-1)j和i(j-1)這兩條字符串能夠到達(dá)ij
            }else if(memo[li][ri-1]>memo[li-1][ri]){
                memo[li][ri]=memo[li][ri-1];
                memoPath[li][ri]=2;
            }else{
                memo[li][ri]=memo[li-1][ri];
                memoPath[li][ri]=3;
            }
        }
    }

    for(auto i:memo)
    {
        cout<<endl;
        for(auto j:i)
        {
            cout<<j<<" ";
        }
    }
    cout<<endl;
    
    int pathL=memoPath.size()-1;
    int pathR=memoPath[0].size()-1;
    string s;
    while(pathL>0 && pathR>0)
    {
        if(memoPath[pathL][pathR] == 1)
        {
            s.push_back(l[pathL-1]);
            pathL--;
            pathR--;
        }else if(memoPath[pathL][pathR] == 2)
        {
            pathR--;
        }else{
            pathL--;
        }
    }
    reverse(s.begin(),s.end());

    cout<<endl;
    return s;    
}

int main()
{
    string l,r;
    cin>>l>>r;
    // l="bdcaba";
    // r="abcbdab";
    cout<<"result: "<<commonStr(l,r)<<endl;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,778評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,795評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,993評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,229評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,687評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,990評(píng)論 2 374

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

  • 1. 01反轉(zhuǎn) 題目 牛牛正在挑戰(zhàn)一款名為01翻轉(zhuǎn)的游戲。游戲初始有A個(gè)0,B個(gè)1,牛牛的目標(biāo)就是把所有的值都變...
    Myth52125閱讀 1,062評(píng)論 0 0
  • C語言基礎(chǔ) 編譯程序 gcc xx.c,他會(huì)默認(rèn)生成a.out的可執(zhí)行文件,在a.out所在目錄,執(zhí)行./a.ou...
    帥碧閱讀 643評(píng)論 1 3
  • 1.編譯程序(1)gcc xx.c,他會(huì)默認(rèn)生成一個(gè)a.out的可執(zhí)行文件,在a.out所在目錄,執(zhí)行./a.o...
    萌面大叔2閱讀 1,313評(píng)論 0 1
  • 問題描述 牛牛正在挑戰(zhàn)一款名為01翻轉(zhuǎn)的游戲。游戲初始有A個(gè)0,B個(gè)1,牛牛的目標(biāo)就是把所有的值都變?yōu)?,每次操作...
    RobotBerry閱讀 319評(píng)論 0 0
  • 在當(dāng)前 PHP 版本的默認(rèn)配置下,“輸出緩沖(Output Buffering)”是被打開的。舊版本則不是這樣,在...
    程序員祝融閱讀 350評(píng)論 0 1