题干:
给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
public class 通过删除字母匹配到字典里最长单词 {
public static void main(String[] args) {
String s = "abpcplea";
List<String> dictionary = new ArrayList<String>();
dictionary.add("ale");
dictionary.add("apple");
dictionary.add("monkey");
dictionary.add("ple");
System.out.println(findLongestWord(s,dictionary));
}
public static String findLongestWord(String s, List<String> dictionary) {
String LongestWord = "";
for(String target:dictionary){
int l1 = LongestWord.length(),l2=target.length();
if(l1>l2||(l1==l2&&LongestWord.compareTo(target)<0))
continue;
if(isSubStr(s,target))
LongestWord = target;
}
return LongestWord;
}
public static 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();
}
}
辅助函数isSubStr()用于判断字典中的字符串是否为给定字符串通过删除字符可得到的子串。While循环内是一个双指针判断字符是否相同,若当前字符不同,继续遍历给定字符串指针,字典中字符串指针不动,因为只需要知道字典中的字符串是否为给定字符串通过删除字符可得到的子串。
findLongestWord()函数遍历字典中各字符串(即目标字符串),先判断目标字符串的长度是否小于候选最长子串的长度,如果比候选最长子串的长度还小,那都不需要去判断目标字符串是否为给定字符串的子串了,直接pass掉,还有一点要注意,因为题干要求在长度相同时返回字典序最小的字符串,所以用compareTo去比较当目标字符串与候选最长子串长度相同时,候选最长字符串与给定字符串的字典序,如果目标字符串的字典序大于候选最长子串,则直接pass掉目标字符串。