方法一:排序 + 找子串
问题中匹配的条件是我们需要考虑字典中能匹配的最长字符串,相同长度的情况下考虑字典序最小的。为了简化搜索过程,我们把字典中的字符串按照这一规则排序,这样越靠前的字符串是我们越优先考虑的。
现在,与其删除 ss 中的字符,我们直接从头开始检查字典中的单词是否是 ss 串的子序列。这是因为,如果 xx 是 ss 的子序列,我们可以直接通过删除 ss 中的某些字符得到 xx 。
如果 xx 是 ss 的子序列,那么 xx 中的每个字符在 ss 中出现过
class Solution {
public String findLongestWord(String s, List < String > d) {
Collections.sort(d,new Comparator<String>(){
public int compare(String s1,String s2){
return (s2.length()!=s1.length())?s2.length()-s1.length():s1.compareTo(s2);
}
});
for(String str:d){
if(isSubsequence(str,s))
return str;
}
return "";
}
public boolean isSubsequence(String s1,String s2){
int j = 0;
for(int i = 0;i<s2.length() && j<s1.length();i++){
if(s1.charAt(j) == s2.charAt(i))
j++;
}
return j == s1.length();
}
}
方法二:不用排序
打擂台找 maxStr
class Solution {
public String findLongestWord(String s, List < String > d) {
String maxStr = "";
for(String str:d){
if(isSubsequence(str,s))
if(str.length()>maxStr.length()||(str.length()==maxStr.length() && str.compareTo(maxStr)<0))
maxStr = str;
}
return maxStr;
}
public boolean isSubsequence(String s1,String s2){
int j = 0;
for(int i = 0;i<s2.length() && j<s1.length();i++){
if(s1.charAt(j) == s2.charAt(i))
j++;
}
return j == s1.length();
}
}