Python编程题40--验证字母表的顺序

2021-12-26  本文已影响0人  wintests

题目

给定一个含有多个字符串的列表 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

代码实现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

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

上一篇 下一篇

猜你喜欢

热点阅读