小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
524. 通过删除字母匹配到字典里最长单词
给你一个字符串 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] 仅由小写英文字母组成
解题思路
解决这题我们可以先分解为两个子问题
-
我们需要判断dictionary 中的字符串 t 是否可以通过删除 s 中的某些字符得到;
-
找到长度最长且字典序最小的字符串
-
对于问题一 我们可以使用双指针可以很直接判断字典里面的字符串,是否属于s的一个子序列。
-
对于问题二 遍历字典中,所有的字符串,找出长度最长且字典序最小,属于s的子序列的字符串。
代码
class Solution {
public String findLongestWord(String s, List<String> dictionary) {
int res=0;
String ret="";
for(String k:dictionary)
{
if(k.length()>s.length()||!longest(s,k)) continue;
if(k.length()>res||ret.length()==0||k.length()==res&&ret.compareTo(k)>0)
{
res=k.length();
ret=k;
}
}
return ret;
}
public boolean longest(String a,String b)
{
int l=0,r=0;
while(l<a.length()&&r<b.length()){
if(a.charAt(l)==b.charAt(r))
r++;
l++;
}
return r==b.length();
}
}