给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:
s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”]
输出:
“apple”
示例 2:
输入:
s = “abpcplea”, d = [“a”,“b”,“c”]
输出:
“a”
说明:
所有输入的字符串只包含小写字母。
字典的大小不会超过 1000。
所有输入的字符串长度不会超过 1000。
class Solution {
public String findLongestWord(String s, List<String> d) {
//子字符串:一个字符串 s 被称作另一个字符串 S 的子串,表示 s 在 S 中出现了。
//子序列:一个字符串 s 被称作另一个字符串 S 的子序列,说明从序列 S 通过去除某些元素但不破坏余下元素的相对位置(在前或在后)可得到序列 s
//首先确定一个长字符串,如果新字符串小于现有长字符串,或者如果新字符串长度和最长字符串长度相等,在比较是否相等,如果不相等跳出当前层循环
//否则的化,就用双指针比较子序列是否包含在子字符串。
String longestWord = "";
for(String target : d){
int l1 = target.length();
int l2 = longestWord.length();
//注意这里比较的时候不能用equals因为如果出现'ab' 'ba'就无法比较了,而compareTo是按照字符串字母的的第一个不同元素Ascal编码比较的//我们假设这里字典是有序的,所以这里就是小于0,如果无序这里就没办法写
if(l1 < l2 || (l1 == l2 && longestWord.compareTo(target) < 0)){
continue;
}
if(isSubStr(s , target)){
longestWord = target;
}
}
return longestWord;
}
public boolean isSubStr(String s , String target){
int i = 0, j = 0;
while(i < s.length() && j < target.length()){
if(s.charAt(i) == target.charAt(j)){
j++;
}
i++;
}
return j == target.length();
}
}