1. 程式人生 > 實用技巧 >賞月齋原始碼共享計劃 第六期 變位詞判斷

賞月齋原始碼共享計劃 第六期 變位詞判斷

本文用三種演算法實現了變位詞判斷問題。

所謂“變位詞”是指兩個詞之間存在組成字母的重新排列關係,如:heart和earth,python和typhon

假設參與判斷的詞僅由大寫字母組成。

解題目標:寫一個bool函式,以兩個詞作為引數,返回這兩個詞是否變位詞。

輸入:兩個字串s1和s2

返回:一個bool變數。

# coding=utf8
def judgeStr_1(s1, s2):
    # 先排序,再對比
    list1 = list(s1)
    list2 = list(s2)
    
    list1.sort()
    list2.sort()

    # if list1 == list2:  # 這樣判斷也可以
    #     return True
    # else:
    #     return False
    
    if len(list1) != len(list2):
        return False

    for i in range(len(list1)):
        if list1[i] == list2[i]:
            continue
        else:
            return False
    return True


def judgeStr_2(s1, s2):         # 打鉤法(兩層迴圈,在s2裡邊便利找s1的當前值,找到打標記found,未找到found=false),注意s1每迴圈一次都要將found置為false
    l1 = list(s1)
    l2 = list(s2)

    OK = True
    if len(l1) != len(l2):
        OK = False
    k = 0
    found = False
    for i in range(len(l1)):
        found = False
        for j in range(len(l2)):
            if l1[i] == l2[j]:
                found = True
                k = j
                break
        if found == True:
            l2[k] = None
        else:
            OK = False    
    
    return OK


def judgeStr_3(s1, s2):   # 空間換時間:26個字母對應一個長為26的陣列,陣列上的數字表示對應字母在s1,s2中出現了幾次,如果出現次數一樣,則是變位次
    cnt1 = [0] * 26
    cnt2 = [0] * 26
    l1 = list(s1)
    l2 = list(s2)
    if len(l1) != len(l2):
        return False

    # python中獲取ASCII值的函式 ,ord=ordinal(序數的,順序的)
    for i in range(len(l1)):
        cnt1[ord(l1[i])-ord('A')] += 1
    for i in range(len(l2)):
        cnt2[ord(l2[i])-ord('A')] += 1
    OK = True
    for i in range(len(cnt2)):
        if cnt1[i] == cnt2[i]:
            continue
        return False
    
    return True


s1 = "ABCDEFG"
s2 = "BACFEGD"
result1 = judgeStr_1(s1, s2)
result2 = judgeStr_2(s1, s2)
result3 = judgeStr_3(s1, s2)
print(result1, result2, result3)