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编程题汇总(持续更新中……)

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