zoukankan      html  css  js  c++  java
  • 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编程题汇总(持续更新中……)

    作者:wintest
    本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    python一些简单操作
    MySQL事务
    c#替换word中的文本并导出(示例)
    SQLServer将某个字段的多行记录合并返回一行
    SQL根据某字段查询不重复记录
    SQLServer逗号分割字符串返回多行
    c# js日期工具
    onchange,onfocus ,oninput事件
    compositionstart事件与compositionend事件
    图片处理问题
  • 原文地址:https://www.cnblogs.com/wintest/p/15732785.html
Copyright © 2011-2022 走看看