题目
- 通过删除字母匹配到字典里最长单词
给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”
示例 2:
输入:s = “abpcplea”, dictionary = [“a”,“b”,“c”]
输出:“a”
提示:
1 <= s.length <= 1000
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 1000
s 和 dictionary[i] 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
首先明确题目要求的是一个字符串列表里面满足条件的一个字符串(不存在,则返回空串),且有顺序
。
-
有顺序
为了方便起见,一般会对所要查询的列表做排序处理,这里可以用 Java 自带的sort
函数。 -
有条件
这里的条件是 dictionary 中的某些字符串要为 s 的子序列,所以原题目的难点就是如何判断子序列了,这里采用双指针
的方法进行判断,具体算法见代码。
实现
class Solution {
public String findLongestWord(String s, List<String> dictionary) {
// 字符串按长度降序,按字典升序
dictionary.sort((str1, str2) -> {
if (str1.length() != str2.length()) {
return str2.length() - str1.length();
} else {
return str1.compareTo(str2);
}
});
// 判断
for (String t : dictionary) {
if (isSubsequence(t, s)) {
return t;
}
}
return "";
}
// 判断 t 是否 为 s 子序列
public boolean isSubsequence(String t, String s) {
int i = 0, j = 0;
while (i < t.length() && j < s.length()) {
if (t.charAt(i) == s.charAt(j)) {
i++;
}
j++;
}
return i == t.length();
}
}
20210914