最近在刷LeetCode的題解,遇到這樣的題,解答很多是用遞歸做的,我對遞歸不是很熟悉,每次都會盡量避免使用遞歸。
看到這個題解感覺還不錯,就了解了一下。
有一個最長字元串的初始化,周遊連結清單,每次都跟連結清單裡的字元串比較,看看長度是否有效,以及字典序。 如果連結清單元素有成為最長字元串的可能的話,就用isValued來判斷通過删除S的某些字元,能否構成該連結清單元素。
個人覺得這個方法非常妙,适合我的思維。
來源:http://cyc2018.gitee.io/cs-notes/#/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8F%8C%E6%8C%87%E9%92%88
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的長度應當和連結清單元素相等。
}