【Python】(二)第二個(gè)字符串是否只是第一個(gè)的重新排列?

問題描述

我們的目標(biāo)是寫一個(gè)函數(shù)敞斋,它將兩個(gè)字符串做參數(shù)并返回布爾值截汪。如果第二個(gè)字符串只是第一個(gè)的重新排列,那么返回True植捎,否則返回False衙解。例如,'apple' 和 'paple' 就返回True焰枢。'java' 和 'aavj' 也是蚓峦。
我們假設(shè)兩個(gè)字符串具有相等的長(zhǎng)度,并且他們由 26 個(gè)小寫英文字母組成济锄。

逐個(gè)字符比較法

首先我們考慮逐個(gè)將第一個(gè)字符串中的字符與第二個(gè)字符進(jìn)行比較枫匾,判斷包含關(guān)系,如果全部包含在第二個(gè)字符中

def method_1(str_1, str_2):
    str_2 = list(str_2)
    pos_1 = 0
    flag_same = True
    while pos_1<len(str_1) and flag_same:
        try:
            pos_2 = str_2.index(str_1[pos_1]) ##查找操作
            str_2.pop(pos_2)
        except:
            flag_same = False
        pos_1 += 1
    return flag_same

def main():
    ###前三個(gè)正確結(jié)果為true拟淮,后兩個(gè)正確結(jié)果為false干茉。
    List1 = ['apple','pear','reading','swimming','commic']
    List2 = ['paple','aerp','ndrgiea','mwgswini','imiucm']
    
    ###逐個(gè)比較法
    for i in range(len(List1)):
        print("Sum method 1 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_1(List1[i], List2[i])))

    print("----------------------------------------------")

if __name__ == "__main__":
    main()

運(yùn)行結(jié)果為:

Sum method 1 -- apple and paple -- Result True .
Sum method 1 -- pear and aerp -- Result True .
Sum method 1 -- reading and ndrgiea -- Result True .
Sum method 1 -- swimming and mwgswini -- Result False .
Sum method 1 -- commic and imiucm -- Result False .
----------------------------------------------

結(jié)果是正確的,查找操作的時(shí)間復(fù)雜度假設(shè)為O(n)很泊,則總的時(shí)間復(fù)雜度為O(n^2)角虫。

先排序后比較的方法

兩個(gè)字符串如果能夠返回True沾谓,那么它們?cè)谧址?jí)別各自排序后應(yīng)該是相同的字符串。

def method_1(str_1, str_2):
    str_2 = list(str_2)
    pos_1 = 0
    flag_same = True
    while pos_1<len(str_1) and flag_same:
        try:
            pos_2 = str_2.index(str_1[pos_1]) ##查找操作
            str_2.pop(pos_2)
        except:
            flag_same = False
        pos_1 += 1
    return flag_same

def method_2(str_1, str_2):
    str_1 = list(str_1)
    str_1.sort() ##排序操作
    str_2 = list(str_2)
    str_2.sort() ##排序操作
    for i in range(len(str_1)):
        if str_1[i] != str_2[i]:
            return False
    return True

def main():
    ###前三個(gè)正確結(jié)果為true戳鹅,后兩個(gè)正確結(jié)果為false均驶。
    List1 = ['apple','pear','reading','swimming','commic']
    List2 = ['paple','aerp','ndrgiea','mwgswini','imiucm']
    
    ###逐個(gè)比較法
    for i in range(len(List1)):
        print("Sum method 1 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_1(List1[i], List2[i])))

    print("----------------------------------------------")
    
    ###排序后比較法
    for i in range(len(List1)):
        print("Sum method 2 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_2(List1[i], List2[i])))

    print("----------------------------------------------")

if __name__ == "__main__":
    main()

運(yùn)行結(jié)果如下:

Sum method 1 -- apple and paple -- Result True .
Sum method 1 -- pear and aerp -- Result True .
Sum method 1 -- reading and ndrgiea -- Result True .
Sum method 1 -- swimming and mwgswini -- Result False .
Sum method 1 -- commic and imiucm -- Result False .
----------------------------------------------
Sum method 2 -- apple and paple -- Result True .
Sum method 2 -- pear and aerp -- Result True .
Sum method 2 -- reading and ndrgiea -- Result True .
Sum method 2 -- swimming and mwgswini -- Result False .
Sum method 2 -- commic and imiucm -- Result False .
----------------------------------------------

排序操作的時(shí)間復(fù)雜度通常為O(n2)或O(nlogn),因而總的時(shí)間復(fù)雜度也是O(n2)或O(nlogn)枫虏。這與第一種方法的時(shí)間復(fù)雜度基本相當(dāng)妇穴。

先計(jì)數(shù)后比較法

我們以26個(gè)計(jì)數(shù)單位來計(jì)數(shù)兩個(gè)字符串中字符出現(xiàn)的次數(shù),比較是否相同隶债。


def method_1(str_1, str_2):
    str_2 = list(str_2)
    pos_1 = 0
    flag_same = True
    while pos_1<len(str_1) and flag_same:
        try:
            pos_2 = str_2.index(str_1[pos_1]) ##查找操作
            str_2.pop(pos_2)
        except:
            flag_same = False
        pos_1 += 1
    return flag_same

def method_2(str_1, str_2):
    str_1 = list(str_1)
    str_1.sort() ##排序操作
    str_2 = list(str_2)
    str_2.sort() ##排序操作
    for i in range(len(str_1)):
        if str_1[i] != str_2[i]:
            return False
    return True

def method_3(str_1, str_2):
    count_list = [0]*26 ##計(jì)數(shù)用數(shù)組
    for x in list(str_1):
        count_list[ord(x)-ord('a')] += 1
    for x in list(str_2):
        count_list[ord(x)-ord('a')] -= 1
    for x in count_list:
        if x != 0:
            return False
    return True

def main():
    ###前三個(gè)正確結(jié)果為true腾它,后兩個(gè)正確結(jié)果為false。
    List1 = ['apple','pear','reading','swimming','commic']
    List2 = ['paple','aerp','ndrgiea','mwgswini','imiucm']
    
    ###逐個(gè)比較法
    for i in range(len(List1)):
        print("Sum method 1 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_1(List1[i], List2[i])))

    print("----------------------------------------------")
    
    ###排序后比較法
    for i in range(len(List1)):
        print("Sum method 2 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_2(List1[i], List2[i])))

    print("----------------------------------------------")
    
    ###計(jì)數(shù)后比較法
    for i in range(len(List1)):
        print("Sum method 3 -- %s and %s -- Result %s ."%(List1[i], List2[i], method_3(List1[i], List2[i])))

if __name__ == "__main__":
    main()

運(yùn)行結(jié)果如下:

Sum method 1 -- apple and paple -- Result True .
Sum method 1 -- pear and aerp -- Result True .
Sum method 1 -- reading and ndrgiea -- Result True .
Sum method 1 -- swimming and mwgswini -- Result False .
Sum method 1 -- commic and imiucm -- Result False .
----------------------------------------------
Sum method 2 -- apple and paple -- Result True .
Sum method 2 -- pear and aerp -- Result True .
Sum method 2 -- reading and ndrgiea -- Result True .
Sum method 2 -- swimming and mwgswini -- Result False .
Sum method 2 -- commic and imiucm -- Result False .
----------------------------------------------
Sum method 3 -- apple and paple -- Result True .
Sum method 3 -- pear and aerp -- Result True .
Sum method 3 -- reading and ndrgiea -- Result True .
Sum method 3 -- swimming and mwgswini -- Result False .
Sum method 3 -- commic and imiucm -- Result False .

在O(n)的時(shí)間復(fù)雜度下就可以完成運(yùn)算死讹,這種空間換時(shí)間的方法是更為有效的瞒滴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赞警,隨后出現(xiàn)的幾起案子妓忍,更是在濱河造成了極大的恐慌,老刑警劉巖愧旦,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世剖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笤虫,警方通過查閱死者的電腦和手機(jī)旁瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耕皮,“玉大人境蜕,你說我怎么就攤上這事蝙场×柰#” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵售滤,是天一觀的道長(zhǎng)罚拟。 經(jīng)常有香客問我,道長(zhǎng)完箩,這世上最難降的妖魔是什么赐俗? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮弊知,結(jié)果婚禮上阻逮,老公的妹妹穿的比我還像新娘。我一直安慰自己秩彤,他們只是感情好叔扼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布事哭。 她就那樣靜靜地躺著,像睡著了一般瓜富。 火紅的嫁衣襯著肌膚如雪鳍咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天与柑,我揣著相機(jī)與錄音谤辜,去河邊找鬼。 笑死价捧,一個(gè)胖子當(dāng)著我的面吹牛丑念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播干旧,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼渠欺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了椎眯?” 一聲冷哼從身側(cè)響起挠将,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎编整,沒想到半個(gè)月后舔稀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掌测,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年内贮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汞斧。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夜郁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粘勒,到底是詐尸還是另有隱情竞端,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布庙睡,位于F島的核電站事富,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乘陪。R本人自食惡果不足惜统台,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啡邑。 院中可真熱鬧贱勃,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拔鹰,卻和暖如春仪缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背列肢。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工恰画, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓷马。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓拴还,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欧聘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 首先總結(jié)以下Java和C、C++中的一般控制臺(tái)輸入方式怀骤,方便以后的編程題: java鍵盤輸入 java讀文件(會(huì)自...
    androidjp閱讀 2,278評(píng)論 0 16
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)费封。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 西湖文化廣場(chǎng) 什么時(shí)候來的杭州? 9月末10月初蒋伦。 什么時(shí)候想來的杭州弓摘? 很久之前就想。 為什么想來杭州痕届? 恩.....
    那點(diǎn)鼻事閱讀 313評(píng)論 0 0
  • 已經(jīng)坐上回家的大巴了研叫,雨下的特別大锤窑,天冷的讓人直打哆嗦。出門前雖是看了天氣預(yù)報(bào)嚷炉,卻高估了自己個(gè)御寒能力渊啰,出發(fā)那...
    咸魚愛蝦米閱讀 271評(píng)論 0 0