词典中最长的字符串

字典中最长的字符串

题目描述:

给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。

若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。

示例 1:

输入:words = [“w”,“wo”,“wor”,“worl”, “world”]
输出:“world”
解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。
示例 2:

输入:words = [“a”, “banana”, “app”, “appl”, “ap”, “apply”, “apple”]
输出:“apple”
解释:“apply” 和 “apple” 都能由词典中的单词组成。但是 “apple” 的字典序小于 “apply”

提示:

1 <= words.length <= 1000
1 <= words[i].length <= 30
所有输入的字符串 words[i] 都只包含小写字母。

思路:

当看到需要找到最长的字符串时,会想起来DFA算法,但是在其中使用了大量的Map集合且内部嵌套Map集合,创建麻烦,DFA算法在创建的时候需要一个字符一个字符的去判断是否存在这个键,这个过程会造成时间浪费,而且复杂度更高,需要多方面考虑,容易出错。

这里采用的是利用Set集合完成,我们将数组按照长度由小到大的顺序进行排列,随后判断比他少一个字符的字符串是否存在,如果存在,那么这个字符串可能就是我们需要查找的最长的字符串,也可能只是一个中间值,因此在这里需要进行记录最大的长度以及最大字符串的值。

代码
class Solution {
    public String longestWord(String[] words) {
        Set<String> set =new HashSet<>();
        //重新定义排列方式: 根据字符串长度进行排列,
        Arrays.sort(words,(a,b)->{
            if(a.length()!=b.length()){
                return a.length()-b.length();
            }else{
                return b.compareTo(a);
            }

        });
        //添加一个 "" 是因为当字符串的长度为1的时候,比他少一个字符的只能是"",否则无法加入
        //也可以进行优化,如果长度为1直接放入到set集合
        set.add("");
        String longestWord="";
        for(int i =0;i< words.length;i++){
            String word= words[i];
            // 判断比他少一位的字符串是否存在,存在就放进去
            if(set.contains(word.substring(0,word.length()-1))){
                set.add(word);
                //在这里不记录最大长度是因为我们在开始的时候已经排过序了,越往后去字符串长度越长
                longestWord=word;
            }
        }
        return longestWord;
    }
}
提交结果

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值