题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a25644e5a85793871b5f08c3bd4423ce.png)
题目分析
- 这道题的意思就是:删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最小字符串。
- 题目中提到可以通过删除字符串 s 中的一个字符得到字符串 t,那么就可以认为 t 是 s 的子序列
- 所以这道题本质上就是查找最长子序列
- 也就是:在
给定的字符串字典集合
中查找给定字符串
的子序列
,且要求为最长的,字典顺序最小的 - 字典顺序可以使用
compareTo()
方法来判断
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d95926dcfddc3af5cbe134aba17ced29.png)
解法分析
- 可以参考《官方题解》,方法较多,这里着重介绍双指针法
- 双指针应用在判断某字符串是否是另外一个字符串的子序列上
代码
class Solution {
public String findLongestWord(String s, List<String> d) {
String res = "";
for(String str : d){
int la = res.length();
int lb = str.length();
if (la > lb || (la == lb && res.compareTo(str) < 0)){
continue;
}
if (isSubStr(s,str)){
res = str;
}
}
return res;
}
private boolean isSubStr(String s,String str){
int i = 0, j = 0;
while(i<s.length() && j < str.length()){
if (s.charAt(i) == str.charAt(j)){
j++;
}
i++;
}
return j == str.length();
}
}