最近在刷LeetCode的题解,遇到这样的题,解答很多是用递归做的,我对递归不是很熟悉,每次都会尽量避免使用递归。
看到这个题解感觉还不错,就理解了一下。
有一个最长字符串的初始化,遍历链表,每次都跟链表里的字符串比较,看看长度是否有效,以及字典序。 如果链表元素有成为最长字符串的可能的话,就用isValued来判断通过删除S的某些字符,能否构成该链表元素。
个人觉得这个方法非常妙,适合我的思维。
public String findLongestWord(String s, List<String> d) {
String longestWord = "";//最长字符串
for (String target : d) { //遍历
int l1 = longestWord.length(), l2 = target.length(); //l1代表最长字符串, l2代表链表里面的字符串
if (l1 > l2 || (l1 == l2 && longestWord.compareTo(target) < 0)) { //若l1>l2, 或者二者相等,但是l2的字典序比l1大,直接下一个,无需更新
continue;
}
if (isValid(s, target)) { //如果s与链表里面的比较,
longestWord = target;
}
}
return longestWord;
}
private boolean isValid(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();///如果最后匹配了,那么j的长度应当和链表元素相等。
}