Python編程題40--驗證字母表的順序

題目

給定一個含有多個字符串的列表 words,以及自定義字母表的順序 order,只有當列表中的所有字符串均按order中的字典序排列時,返回 true;否則,返回 false。

例如:

給定一個列表words:["hello", "leetcode"],自定義字母表的順序 order:"hlabcdefgijkmnopqrstuvwxyz"
返回結果:true

解釋:在自定義字母表的順序中,'h' 位於 'l' 之前,所以列表是按字典序排列的

給定一個列表words:["word", "world", "row"],自定義字母表的順序 order:"worldabcefghijkmnpqstuvxyz"
返回結果:false

解釋:在自定義字母表的順序中,'d' 位於 'l' 之後,那麼 words[0] > words[1],所以列表不是按字典序排列的

說明

  • 在 words[i] 和 order 中的所有字符都是英文小寫字母
  • 對於空白字符,定義爲比其他字符都要小,比如當 "apple" 和 "app" 進行比較,前3個字符完全相同,然後 "apple" 的第4個字符需要和空白字符比較,最終結果是 "app" 排列在 "apple" 前面

實現思路1

  • 首先使用一個字典存儲order中所有字母及其順序,然後再通過兩層循環判斷列表排序是否正確
  • 第一層循環,對列表進行遍歷,每次都取當前遍歷的字符串 words[i] 與其下一個字符串 words[i+1];第二層循環,對這兩個字符串進行比較,判斷排序是否正確
  • 比較的兩個字符串中,如果當前字符串的下標 j下的字符,字典序大於 下一個字符串的下標 j下的字符,那麼說明列表排序錯誤,直接返回 False
  • 比較的兩個字符串中,如果當前字符串的下標 j下的字符,字典序等於 下一個字符串的下標 j下的字符,需繼續比較它們下標 j+1字符
  • 比較的兩個字符串中,如果當前字符串的下標 j下的字符,字典序小於 下一個字符串的下標j下的字符,則說明這2個字符串排序正確,跳出當前循環

代碼實現1

def isDiySorted(words, order):
    tmp_dict = {c: i for i, c in enumerate(order)}  # order字典序
    for i in range(len(words) - 1):
        len1, len2 = len(words[i]), len(words[i + 1])
        order1, order2 = tmp_dict.get(words[i][0]), tmp_dict.get(words[i + 1][0])
        min_word_length = len1
        if len1 > len2:
            # 如果下一個字符串(如 app )恰好等於當前字符串的前部分(如 apple )
            if words[i + 1] == words[i][:len2]:
                return False
            min_word_length = len2
        for j in range(min_word_length):
            order1, order2 = tmp_dict.get(words[i][j]), tmp_dict.get(words[i + 1][j])
            if order1 > order2:  # 如果當前字符串的下標 j下的字符,字典序大於 下一個字符串的下標 j下的字符
                return False
            elif order1 == order2:  # 如果當前字符串的下標 j下的字符,字典序等於 下一個字符串的下標j下的字符,需繼續比較 j+1字符
                continue
            else:  # 其他情況則說明當前比較的字符串排序正確,直接跳出當前比較循環
                break
    return True

實現思路2

  • 先使用一個字典存儲order中所有字母及其順序
  • 再利用Python的內置函數 sorted() 對列表words進行排序
  • 如果排序後的列表,與原列表words順序完全一致,則說明原列表排序正確返回True,否則返回False

代碼實現2

def isDiySorted(words, order):
    """
    sorted()函數中的參數 key 可傳入一個函數,這裏 key=lambda word: [tmp_dict.get(i) for i in word]
    sorted()函數把 words 中的每個元素均傳入到 key 的函數中,然後會返回一個列表,該列表包括有當前元素中每個字符的字典序下標 tmp_dict.get(i) ,均爲數字
    當每個元素都返回對應的字典序下標列表後,因爲其列表元素都是數字,sorted()函數會自動對其進行默認排序
    """
    tmp_dict = {c: i for i, c in enumerate(order)}  # order字典序
    return words == sorted(words, key=lambda word: [tmp_dict.get(i) for i in word])

更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章