LeetCode算法题-Longest Word in Dictionary(Java实现)

知识图谱本体建模之RDF、RDFS、OWL详解 (一)知识图谱本体建模之RDF、RDFS、OWL详解 1.语义网体系 知识图谱于2012年由Google提出,并不是新概念,而是由语义网络(Semantic Network)衍生而来。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系。RDF,RDFS与OWL都是基于语义网的知识表示框架,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。RDF,RDFS/OWL 属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。其语义网技术栈如下所示。 2.RD 阅读详情

这是悦乐书的第303次更新,第322篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720)。给出表示英语词典的字符串单词数组,找到单词中长度最长的单词,此单词可以通过数组中的其他单词一次次构建一个字符而得来。如果有多个可能的答案,则返回字典顺序最小的最长单词。如果没有答案,则返回空字符串。例如:

输入:words = [“w”,“wo”,“wor”,“worl”,“world”]

输出:“world”

说明:“world”这个词可以通过“w”,“wo”,“wor”和“worl”一次构建一个字符。


输入:words = [“a”,“banana”,“app”,“appl”,“ap”,“apply”,“apple”]

输出:“apple”

说明:“apply”和“apple”都可以从字典中的其他单词构建。但是,“apple”在词典上比“apply”更小(靠前)。


注意:

  • 输入中的所有字符串仅包含小写字母。

  • 单词的长度将在[1,1000]范围内。

  • 单词[i]的长度将在[1,30]的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

在解题前,需要先注意题目中的几个信息,一是满足题目条件的结果字符串,是有一个个字符累加起来的,在我的一次提交中,有{“ew”,“ewq”,“ewqz”}这三个字符串,我的算法算出来是第三个"ewqz",但其实它还缺少一个"e",是不符合题目要求的。二是如果满足题目条件的字符串有两个或者多个,需要去比较谁更小,也就是按照字母顺序由小到大排列的,谁更靠前谁更小。

思路是先将字符串放进HashMap中,key为每一个单词,value为单词的长度。循环单词数组,比较谁的长度更小,此处分为两种情况处理:一是大于已有最大长度,二是等于已有最大长度,另外,无论遇到那种情况,都需要去判断当前字符是否是由单个单词一次次累加变成的,对此单独写了一个方法判断当前单词是否符合题目要求的方法isExists。针对第二种情况,需要去比较两个单词的大小,也写了一个额外的方法isMin来判断,如果满足,就将结果字符串更新,最长长度保持不变。

Map<String, Integer> map = new HashMap<String, Integer>();
public String longestWord(String[] words) {
    for (String str : words) {
        map.put(str, str.length());
    }
    int len = Integer.MIN_VALUE;
    String result = "";
    for (String str : words) {
        if (isExists(str) && str.length() > len) {
            result = str;
            len = str.length();
        } else if (isExists(str) && str.length() == len) {
            if (result != "") {
                if (isMin(str, result)) {
                    result = str;
                }
            }
        }
    }
    return result;
}

/**
 * 判断str是否小于str2
 * @param str 新遇到的等长字符串
 * @param str2 上一次的最长字符串
 * @return true:str中的字符小于str2
 */
public boolean isMin(String str, String str2){
    for (int i=0; i<str.length(); i++) {
        if (str.charAt(i) < str2.charAt(i)) {
            return true;
        } else if (str.charAt(i) == str2.charAt(i)) {
            continue;
        } else {
            return false;
        }
    }
    return false;
}

/**
 * 判断当前字符串在数组中是否是一个个字符慢慢累加起来的
 * @param str
 * @return
 */
public boolean isExists(String str) {
    String ss = "";
    for (char ch : str.toCharArray()) {
        ss += ch;
        if (!map.containsKey(ss)) {
            return false;
        }
    }
    return true;
}

03 第二种解法

在第一种解法中,并没有用到HashMap中的value值,因此可以使用HashSet来存储数组中的单词。其次,也可以通过数组排序的方式,省去后续循环中判断最长长度相等的情况,也省去了比较两个字符串谁更小的判断,更加的简洁。

Set<String> set = new HashSet<String>();
public String longestWord2(String[] words) {
    Arrays.sort(words);
    for (String word : words) {
        set.add(word);
    }
    int len = Integer.MIN_VALUE;
    String result = "";
    for (String str : words) {
        if (isExists2(str) && str.length() > len) {
            result = str;
            len = str.length();
        }
    }
    return result;
}

public boolean isExists2(String str) {
    String ss = "";
    for (char ch : str.toCharArray()) {
        ss += ch;
        if (!set.contains(ss)) {
            return false;
        }
    }
    return true;
}

04 第三种解法

也可以只使用一个循环来解决。依旧是数组排序,使用HashSet存储数组中的单词,但是存入HashSet的操作是在循环中进行的,如果当前单词的长度等于1或者其本身的子串也存在于HashSet中,才存入HashSet,此步骤就相当于第一种解法和第二种解法中判断当前单词是否符合题目要求,由一个字符一次次累加得来的。如果当前字符的长度大于结果单词的长度,就进行赋值更新操作。

public String longestWord3(String[] words) {
    Set<String> set = new HashSet<String>();
    Arrays.sort(words);
    String result = "";
    for (String word : words) {
        if (word.length() == 1 || set.contains(word.substring(0, word.length()-1))) {
            if (word.length() > result.length()) {
                result = word;
            }
            set.add(word);
        }
    }
    return result;
}

05 第四种解法

我们也可以不借助排序来实现,其实也是对第二种解法的优化。依旧是使用HashSet,也借助了一个辅助方法isExists2来判断当前单词是否符合题目要求,但不同的是,在循环中,此判断只在当前单词长度大于结果单词的长度,或者两者长度相等且新单词小于结果单词这两种情况下进行,而不像第二种解法那样,每次都去先判断当前单词是否符合题目要求,再去比较长度。其中,比较两个单词的大小借助了字符串自带的compareTo方法。

Set<String> set = new HashSet<String>();
public String longestWord4(String[] words) {
    for (String word : words) {
        set.add(word);
    }
    String result = "";
    for (String word : words) {
        if (word.length() > result.length() || (word.length() == result.length() && word.compareTo(result) < 0)) {
            if (isExists2(word)) {
                result = word;
            }
        }
    }
    return result;
}

public boolean isExists2(String str) {
    String ss = "";
    for (char ch : str.toCharArray()) {
        ss += ch;
        if (!set.contains(ss)) {
            return false;
        }
    }
    return true;
}

06 小结

算法专题目前已日更超过五个月,算法题文章171+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

TensorRT的安装:一步一步教会你如何安装TensorRT TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。 阅读详情

相关推荐

Android 集成Chrome 浏览器内核 Crosswalk

Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 Android 系统版本,并且各个厂商对内置应用进行定制化,有可能用的不是最新的浏览器内核)。这就导致 WebView 在真实环境中对 API 的支持根本无迹可寻,越发混乱。 随着混合开发的兴起,前端对 ...

司马懿的西山居 2万+

Find the Longest Word in a String

找出最长单词 在句子中找出最长的单词,并返回它的长度。 函数的返回值应该是一个数字。 当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。 这是一些对你有帮助的资源: String.split() String.length 示例:findLongestWord("The quick brown fox jumped over t...

weixin_34342992的博客 146

哨兵1号(Sentinel-1)雷达SAR数据预处理全流程:从下载到精确配准

本文详细介绍了哨兵1号(Sentinel-1)雷达SAR数据从下载到精确配准的全流程预处理方法。内容涵盖SLC与GRD数据选择、ASF平台下载技巧,并重点解析了使用SNAP软件进行几何校正、辐射定标及高精度配准的核心步骤,为InSAR形变监测等应用提供可靠的数据基础。

weixin_29208327的博客 480

[LeetCode] 212. Word Search II 词语搜索 II

Given a 2D board and a list of words from the dictionary, find all words in the board. Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horiz...

weixin_30527143的博客 140

Pipeline更多理解

Pipe 类型用途VIGVideo Image Generator:用于图层显示,支持 scaling、rotationRGB简单图层显示,较低优先级DMA主要用于 writeback / WFD / composition output,即从 framebuffer 输出到外部设备(或 memory)Cursor小图层,用于显示指针等很可能是:分别用于主屏、仪表、虚拟显示的输出路径或者用于不同的 display 去做 GPU_TARGET / writeback 的拷贝你看到的意思。

Damon_X的博客 1053

CAN-do-paser:Java开发的CAN总线数据帧解析库

CAN总线数据帧使用DBC文件信息解析为物理量,基于Java开发的数据解析工具。

佳瑞的博客 1136

K-Means算法的代码实现(Java)

K-Means算法的代码实现(Java)   2013-03-02 20:28:41|  分类: 数据挖掘 |  标签: |举报 |字号大中小 订阅 //package cn.edu.pku.ss.dm.cluster; import java.io.BufferedReader; import java.io.BufferedWriter; import jav

daguocai的专栏 2283

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.youkuaiyun.com/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

面试题 17.15. 最长单词

面试题 17.15. 最长单词 给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。 示例: 输入: ["cat","banana","dog","nana","walk","walker","dogwalker"] 输出: "dogwalker" 解释: "dogwalker"可由"dog"和"walker"组成。 提示: 0 <= len(words) <

wat1r的博客 1027

STM32外部中断与事件机制深度解析:从硬件触发到软件响应

本文深入解析STM32外部中断与事件机制,从硬件触发到软件响应的完整流程。通过对比中断和事件的应用场景、响应速度及配置方法,帮助开发者优化嵌入式系统设计,特别适合需要低功耗或高实时性的项目。

weixin_29175469的博客 413

分子对接中的相互作用特征分析(目视筛查)

介绍分子对接的相互作用特征,以及如何通过这些特征进行目视筛查

recher_He1107的博客 5762

dictionary 长度 java_LeetCode算法题-Longest Word in Dictionary(Java实现)

这是悦乐书的第303次更新,第322篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720)。给出表示英语词典的字符串单词数组,找到单词中长度最长的单词,此单词可以通过数组中的其他单词一次次构建一个字符而得来。如果有多个可能的答案,则返回字典顺序最小的最长单词。如果没有答案,则返回空字符串。例如:输入:words = [“w”,“wo”,“wor”,“...

weixin_42422648的博客 202

里海NX二次开发3000例-专栏目录

UDO(User Defined Object)是“用户自定义对象”。应用非常广,可以用UDO创建自定义特征,也可以对NX原有的特征添加一些特殊信息,这些信息会保存在部件中,以后可以查询。还可以实时追踪NX对象,例如做3D包容盒线框自动追踪实体,做2D矩形框自动追踪图纸尺寸值,这些在下面的例子都有介绍。读者可以自己编译下面的例子,体会理解UDO的用法。------里海 20230512序号内容​链接01使用UDO在所有实体上设置更新回调​链接02使用UDO生成跟踪实体的线框​链接03删除UDO​链接。

王牌飞行员_里海的博客 7722

leetcode (Longest Word in Dictionary)

Title:Longest Word in Dictionary    720 Difficulty:Easy 原题leetcode地址: https://leetcode.com/problems/longest-word-in-dictionary/   1.  见代码注释 时间复杂度:O(n),一次一层循环,用到了Arrays.sort(),时间复杂度应该是nlogn。 空间复杂...

hsx1612727380的专栏 262

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode-Longest Word in Dictionary

LeetCode Java Longest Word in Dictionary

坟头草一米七五 209

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[leetcode] 720. Longest Word in Dictionary

Description Given a list of strings words representing an English Dictionary, find the longest word in words that can be built one character at a time by other words in words. If there is more than on...

Learning from the mistakes 213

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Leetcode】524. Longest Word in Dictionary through Deleting

题目地址: https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/ 给定一个字符串sss,再给定一个字符串组成的数组AAA,求所有AAA中是sss的子序列的字符串中最长的那个。若答案不唯一,则返回字典序最小的。若答案不存在,则返回空串。 思路是用堆,遍历数组,然后先判断当前字符串aaa是否是sss的子序列...

数学、算法爱好者的博客 250

LeetCode-524. Longest Word in Dictionary through Deleting [C++][Java]

Given a stringsand a string arraydictionary, returnthe longest string in the dictionary that can be formed by deleting some of the given string characters. If there is more than one possible result, return the longest word with the smallest lexicograph

贫道绝缘子的博客 194

leetcode 720. Longest Word in Dictionary

Given a list of strings words representing an English Dictionary, find the longest word in words that can be built one character at a time by other words in words. If there is more than one possi...

djph26741的博客 189

Leetcode-524. Longest Word in Dictionary through Deleting

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发优快云,mcf171专栏。这次比赛略无语,没想到前3题都可以用暴力解。 博客链接:mcf171的博客 —————————————————————————————— Given a stri

mcf171的专栏 817

[leetcode] 720. Longest Word in Dictionary

Given a list of strings words representing an English Dictionary, find the longest word in words that can be built one character at a time by other words in words. If there is more than one possible

趋驰 310

[LeetCode]524. Longest Word in Dictionary through Deleting

https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/#/description 给一个字符串和一个字典,找出字符串删除字符后符合字典的最长子串,如果有多个就返回字典序最靠前的 str1.compareTo(str2)返回字典序,str1字典序在前的返回-1,s

gqk289的专栏 850

leetcode720——Longest Word in Dictionary

题目大意:给出字典中的一些字符串,找出他们中的最长单词,使得这个单词由字典中的字符串逐字母生成,如果长度相同取字典序较小的一个。 分析:trie应用。或者用集合set来做。 方法一集合:字符串sort排序后是按长度由小到大,字典序由小到大排列的。取出words中的一个字符串,如果它长度为1或者取出它的长度减一的子串在built集合中,就更新答案,并将当前取出的字符串放入bu...

tzyshiwolaogongya的博客 550

LeetCode 524. Longest Word in Dictionary through Deleting

原题链接在这里:https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/ 题目: Given a string and a string dictionary, find the longest string in the dictionary that can be formed by de...

weixin_30650859的博客 67
上一篇: LeetCode算法题-1-bit and 2-bit Characters(Java实现)
下一篇: LeetCode算法题-Find Pivot Index(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值