• Python练习题:根据一段单词,找出其中的最长单词


    题目

    给定一组单词words,请找出其中的最长单词,该最长单词是由words中其他单词逐步添加一个字母组成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的结果,则返回空字符串。

    例如:

    给定一个words:["a", "banana", "app", "appl", "ap", "apply", "apple"]
    返回结果:"apple"

    解释:“apply"和"apple"都是由words中的单词组成,但"apple"的字典序小于"apply”

    给定一个words:["w","ow","wor","b", "owb"]
    返回结果:"b"

    解释:这里words中没有符合条件逐步组成的最长单词,所以单个字母就是最终结果,但"w"的字典序小于"b"

    说明:

    • words中所有单词都只包含小写字母。
    • words中所有单词长度均大于0,且至少存在1个长度仅为1的单词或字母。
    • 最长单词必须是从一个字母开始,在其单词尾部逐步添加一个字母而得到的结果。

    实现思路1

    定义 max_length 表示最长单词的长度,其默认值为0;定义一个列表 res_list,用于存储长度等于 max_length 的所有单词

    遍历 words ,得到所有单词 word ,并设置一个标记flag,默认值为True,用于判断 word 是否是能够完全由其他单词组成

    每次需对当前遍历的单词word进行判断,如果word并不能完全由其他单词组成,那么处理 flag = False,同时结束对当前word的遍历

    每次对当前遍历的单词word进行判断后,如果 flag = True,那么说明 word 是能够完全由其他单词组成,同时需判断当前word的长度是否大于等于 max_length ,如果是那么需要更新 max_length ,并把当前word添加到 res_list

    因为 res_list 中可能存在多个最长的单词,所以需对其进行比较,可对其进行 sort排序 (字符串排序默认按ASCII的大小比较),排序后即可找到其字典序最小的一项

    代码实现1

    def longestWord(words):
        res_list = []
        max_length = 0
        words_set = set(words)
        for word in words:
            flag = True  # 用于标记 word 是否是能够完全由其他单词组成
            for i in range(len(word)):
                tmp = word[:i + 1]
                if tmp not in words_set:  # set查找时间复杂度O(1),如果tmp不在words_set中,直接结束当前word的遍历
                    flag = False
                    break
            # 如果当前word遍历后 flag = True,则说明当前word是能够完全由words中其他单词组成而来
            if flag and max_length <= len(word):
                max_length = len(word)
                res_list.append(word)
        # 可能存在多个最长的单词,先找到所有最长的单词,再sort排序(字符串排序默认按ASCII的大小比较),排序后的第一个元素就是字典序最小的单词
        res_list = [i for i in res_list if len(i) == max_length]
        res_list.sort()
        return res_list[0] if res_list else ""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    实现思路2

    首先对words进行多次排序,第一次按字典序来排序,第二次按单词长度来排序,排序后得到的words顺序是 先按单词长度降序,再按字典序从小到大

    遍历 words ,得到所有单词 word ,并设置一个标记flag,默认值为True,用于判断 word 是否是能够完全由其他单词组成

    每次需对当前遍历的单词word进行判断,如果word并不能完全由其他单词组成,那么处理 flag = False,同时结束对当前word的遍历

    每次对当前遍历的单词word进行判断后,如果 flag = True,那么说明 word 是能够完全由其他单词组成,此时的 word 就是所求的最长单词

    代码实现2

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    def longestWord(words):
        words.sort()  # 多次排序,第一次找字典序最小的,第二次找长度最大的(reverse=True,降序)
        words.sort(key=len, reverse=True)
        words_set = set(words)
        for word in words:
            flag = True
            for i in range(len(words)):
                tmp = word[:i+1]
                if tmp not in words_set:  # set查找时间复杂度O(1),如果tmp不在words_set中,直接结束循环
                    flag = False
                    break
            if flag:
                return word
        return ""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    uniapp 在父组件中使用ref属性调用子组件中的方法 报错undefined
    89-Spring Cloud 微服务详解
    upload-labs1-17思路
    卖出看涨期权和买入看跌期权有什么区别?卖出看跌期权有什么用?
    姑苏寻韵~庆开放原子开源大赛 OpenTiny 前端 Web 应用开发挑战赛路演圆满落幕。
    深度解析自然语言处理之篇章分析
    [论文笔记] Open-Sora 1、sora复现方案概览
    SMTP协议解读以及如何使用SMTP协议发送电子邮件
    C++ 随机数、srand((unsigned)time(NULL)) 详解
    JWL-11/2-99.9A电流继电器
  • 原文地址:https://blog.csdn.net/qdPython/article/details/126195846