0
点赞
收藏
分享

微信扫一扫

LeetCode 524.通过删除字母匹配到字典里最长单词

LeetCode 524.通过删除字母匹配到字典里最长单词题目链接:

​​https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/​​


题目描述:

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。


示例 1:

输入: s = "abpcplea", d = ["ale","apple","monkey","plea"]

输出: "apple"


示例 2:

输入: s = "abpcplea", d = ["a","b","c"]

输出: "a"


提示:

1. 所有输入的字符串只包含小写字母。

2. 字典的大小不会超过 1000。

3. 所有输入的字符串长度不会超过 1000。


题目分析:

按照题目要求,我们需要返回长度最长且字典顺序最小的字符串,因此我们可以先对字典集进行排序,要返回长度最长,排序就得按照字符串长度进行降序排序,要返回字典顺序最小,排序就得按照字典顺序进行升序排序。在排完序后,我们再遍历字典集,检验字典集的字符串是否为所给字符串的子字符串,是的话就返回当前字符串。因此,我们还需要再写一个检查当前字符串是否为所给字符串的子字符串的方法。首先检查所给字符串是否比要比较的子字符串长度还小,如果所给字符串比子字符串还小,所给字符串肯定不会是所给字符串的子字符串。然后我们采用双指针思想,同时遍历两个字符串,只要字符相同,就比较下一个字符。如果字符不同,则删除所给字符串的一个字符,再与当前字符串比较。


题解:

执行用时: 31 ms

内存消耗: 39.2 MB

class Solution {
public String findLongestWord(String s, List<String> dictionary) {
// 如果字典为空,则返回空字符串
if (dictionary == null || dictionary.size() == 0)
return "";
// 对字典集进行排序,先按字符串长度进行降序排序,再对长度相同的字符串按字典顺序进行升序排序
dictionary.sort((x, y) -> x.length() == y.length() ? x.compareTo(y) : y.length() - x.length());
// 遍历字典集,如果字典集里的字符串刚好是字符串s的子字符串,则返回此字符串
for (String string : dictionary)
if (isSubstring(s, string))
return string;
// 否则找不到匹配项,返回空字符串
return "";
}


// 判断是否为子字符串方法,
public boolean isSubstring(String string, String substring) {
// 如果当前字符串string比要比较的字符串substring长度还小,一定不可能是子字符串,返回false
if (string.length() < substring.length())
return false;
// 定义两个指针
int i = 0, j = 0;
// 同时遍历两个字符串
while (i < string.length() && j < substring.length()) {
// 如果当前字符相同,继续比较下一个字符
if (string.charAt(i) == substring.charAt(j))
j++;
// 如果当前字符不同,则删除字符串string当前字符,比较下一个字符
i++;
}
// 如果j的值与子字符串substring长度相同,说明该字符串substring是string的子字符串
return j == substring.length();
}
}


题目来源:力扣(LeetCode)


举报

相关推荐

0 条评论