天天看點

524. Longest Word in Dictionary through Deleting

最近在刷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的長度應當和連結清單元素相等。
    	}