字符串比較-面試題

這是近幾天在LintCode上遇到的一道題,題目如下:

比較兩個(gè)字符串A和B面殖,確定A中是否包含B中所有的字符。字符串A和B中的字符都是大寫字母:

給出 A = "ABCD" B = "AABC", 返回 false

給出 A = "ABCD" B = "ACD"透揣,返回 true

  • 一開始的思路是用A的每一位去和B的每一位去比較婴渡。
    如果說B每一位都能在A中找到的話幻锁,則A中包含B。
    代碼如下:
    bool compareStrings(string A, string B) {
    int countA = A.length();
    int countB = B.length();
    int sub = 0;
    int temp[countB];
    for (int i = 0; i < countB; i++) {
    temp[i]=0;
    }
    for (int i = 0; i < countA; i++) {
    for (int n = 0; n < countB; n++) {
    if ( A[i] == B[n]) {
    temp[n] = 1;
    }
    }
    }
    for (int i = 0; i < countB; i++) {
    sub = temp[i] + sub;
    }
    if (sub == countB)
    return true;
    else
    return false;
    }

但是在遇到B的字符里有A的重復(fù)個(gè)的時(shí)候:
"ABCDEFG", "ACC"
A的同一個(gè)C會(huì)在B中判斷兩次边臼,導(dǎo)致輸出的結(jié)果為true哄尔,但其實(shí)應(yīng)該為false。

  • 所以這次改進(jìn)代碼柠并,避免一個(gè)字符的多次判定岭接。
    要做的很簡單,在判定存在的語句后面加上一個(gè)break臼予。

     for (int i = 0; i < countA; i++) {
         for (int n = 0; n < countB; n++) {
             if ( A[i] == B[n]) {
             temp[n] = 1;
             break;
             }
         }
     }
    

就像上面提到的情況鸣戴,問題又出現(xiàn)了:
"AAAAAAAAAAAABBBBBCDD", "ABCDD"(true)
A的DD在B中只判定了B的第一個(gè)D,就跳出了粘拾,所以輸出為false窄锅。

  • ……很無奈接著補(bǔ)充代碼:

     for (int i = 0; i < countA; i++) {
         for (int n = 0; n < countB; n++) {
             if ( A[i] == B[n]) {
             temp[n] = 1;
             if ( A[i] != A[i-1])//當(dāng)A的后一個(gè)字符與前一個(gè)不一樣時(shí)才跳出循環(huán)
             break;
             }
         }
     }
    

好吧,糟糕的情況又出現(xiàn)了缰雇。
"AAAAAAAAAAAAAAAAAAABBBBBBBBBDFADSFJALSDJFALSDJFSADFADF", "AAAAAABBBBBBBBBDFJALDJF"(true)
這里又錯(cuò)誤的返回了一個(gè)fasle入偷,由于A中的D并不是連續(xù),所以和上面的錯(cuò)誤類似械哟,B中的第二個(gè)D不能得到判定盯串。
做到這里就不得不說下了,像你已經(jīng)看到這種修修補(bǔ)補(bǔ)的代碼戒良,一般情況下都是很糟糕的体捏,而且問題較多。因?yàn)楸仨氁樦懊娴乃悸罚瑏斫鉀Q后面的問題 几缭,你很有可能發(fā)現(xiàn)之前的算法結(jié)構(gòu)在解決后面出現(xiàn)問題時(shí)是異常困難的河泳。最好構(gòu)造算法之前就要考慮到最壞的情況,或者說最后重構(gòu)下自己的代碼年栓。
由于我一開始看到題目中給的的數(shù)據(jù)很簡單就沒考慮到現(xiàn)在的情況拆挥。
我覺得我的方法需要換一種了。

思路如下:

  • 統(tǒng)計(jì)兩邊的信息進(jìn)行比較某抓。如果B中的每種字符的個(gè)數(shù)小于等于A中的纸兔,則A包含B。
    代碼如下:
    int Achar[26];//儲存字符串的每個(gè)字母個(gè)數(shù)
    int Bchar[26];
    for (int i = 0; i<26; i++) {
    Achar[i] = 0;
    Bchar[i] = 0;
    }
    int Adate,Bdate;//記錄AB的字符統(tǒng)計(jì)數(shù)據(jù)
    int countA = A.length();
    int countB = B.length();
    for (int i = 0; i<countA; i++) {
    int index;
    index = A[i] - 65;
    Achar[index]++;
    }
    for (int i = 0; i<countB; i++) {
    int index;
    index = B[i] - 65;//65為大寫A的ASCⅡ碼值
    Bchar[index]++;
    }
    for (int i = 0; i<26; i++) {
    if (Achar[i]<Bchar[i])
    return false;
    }
    return true;
    }

這一次19個(gè)測試數(shù)據(jù)全部通過否副。??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汉矿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子备禀,更是在濱河造成了極大的恐慌洲拇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曲尸,死亡現(xiàn)場離奇詭異赋续,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)另患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門纽乱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昆箕,你說我怎么就攤上這事鸦列。” “怎么了为严?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵敛熬,是天一觀的道長肺稀。 經(jīng)常有香客問我第股,道長,這世上最難降的妖魔是什么话原? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任夕吻,我火速辦了婚禮,結(jié)果婚禮上繁仁,老公的妹妹穿的比我還像新娘涉馅。我一直安慰自己,他們只是感情好黄虱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布稚矿。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晤揣。 梳的紋絲不亂的頭發(fā)上桥爽,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音昧识,去河邊找鬼钠四。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跪楞,可吹牛的內(nèi)容都是我干的缀去。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼甸祭,長吁一口氣:“原來是場噩夢啊……” “哼缕碎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淋叶,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阎曹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后煞檩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體处嫌,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年斟湃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熏迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凝赛,死狀恐怖注暗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墓猎,我是刑警寧澤捆昏,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站毙沾,受9級特大地震影響骗卜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜左胞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一寇仓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烤宙,春花似錦遍烦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽供填。三九已至,卻和暖如春罢猪,著一層夾襖步出監(jiān)牢的瞬間捕虽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工坡脐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泄私,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓备闲,卻偏偏與公主長得像晌端,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子恬砂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

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