题目描述:
事先给定一个字符串 s 和 一个字符串集合 list,判断 list 中的字符串是不是 s 通过删除字符得到的子字符串,
若有多个子字符串,则选取最长的一个。
若有相同长度的,则取字典序最优先的。(在ASCII码中排的前)
思路:
简化问题,把【字符串与字符串集合作比较】简化为【该字符串是不是s的子字符串】,这一步可以通过另写一个方法 isSubString(String s, String target)完成
定义一个 longestWord, 遍历 d ,将每一个 target 与 s 进行 isSubString 比较,
若返回 true,当 target.length() > longestWord.length() ,或 target.length() == longestWord.length() && target.campareTo(longestWord) < 0 时,将 longestWord = target
若返回 false,跳过这次循环
最终返回 longestWord
代码:
private String findLongestWord(String s, List<String> d) {
String longestWord = "";
for (String target : d) {
int l1 = longestWord.length(); int l2 = target.length();
// 判断 target 是否是 s 的子字符串
if (isSubStr(s, target)) {
// target 比 longestWord 长度更长;或者长度相同时,字典序优先
if (l2 > l1 || (l2 == l1 && target.compareTo(longestWord) < 0)) {
longestWord = target;
}
}
}
return longestWord;
}
/**
* 第一种判断子串方式,双指针法,稍慢
* @param s
* @param target
* @return
*/
private boolean isSubString(String s, String target) {
if (target.length() > s.length()) return false;
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();
}
/**
* 第二种判断子串方式,稍快
* @param s
* @param target
* @return
*/
private boolean isSubStr(String s, String target){
int star = -1;
for (char c : target.toCharArray()) {
int index;
if ((index = s.indexOf(c, star + 1)) == -1) {
return false;
}
star = index;
}
return true;
}