LeetCode Easy: 14、20、21
LeetCode練習與詳解

\14. Longest Common Prefix

找最長共通前綴

  • .substring(0, j) 左閉右開
public String longestCommonPrefix(String[] strs) {
    // 當字符串數組長度為 0 時則公共前綴為空,直接返回
    if (strs.length == 0) {
        return "";
    }
    // 令最長公共前綴 ans 的值為第一個字符串("flower"),進行初始化
    String ans = strs[0];
    // 與全部的字符串{"flower", "flow", "flight"}開始比較
    for (int i = 1; i < strs.length; i++) {
        // 從切出字符串的第一個字開始循環
        int j = 0;
        // 開始比較有幾位一樣,直到自己的長度,或其他字串的長度
        for (; j < ans.length() && j < strs[i].length(); j++) {
            if (ans.charAt(j) != strs[i].charAt(j))
                // "有幾位一樣"開始增加,直到比到的字母不一樣,就跳出
                break;
        }
        // 切出答案,j="有幾位一樣",substring是左閉右開
        ans = ans.substring(0, j);
        if (ans.equals(""))
            return ans;
    }
    return ans;
}

\20. Valid Parentheses

有效閉合的括號

  • Stack<> 先入先出的特性
  • .toCharArray() 將字串s轉成char數組
class Solution {
    public boolean isValid(String s) {
        // 奇數直接返回false
        if (s.length() % 2 != 0) return false;
        // 建立一個Stack 棧,特性是先入先出
        Stack<Character> stack = new Stack<Character>();
        // 將字串s轉成char數組,遍歷
        for (char c : s.toCharArray()) {
            // 如果是左括號,就往棧中塞進對應的右括號
            if (c == '(')
                stack.push(')');
            else if (c == '{')
                stack.push('}');
            else if (c == '[')
                stack.push(']');
            // 層層篩到這邊,來到這的絕非左括號,如果是右括號,彈一個出來比比看
            else if (stack.empty() || c != stack.pop())
                // 若棧中根本沒東西(表示從頭到尾都沒有正確的從左括號開始)
                // 或彈出來的括號圖案經比較不相同,都返回false
                return false; 
        }
        return stack.empty();
    }
}

\21. Merge Two Sorted Lists

合併有序鏈表

  • 遞迴的核心在於,我只關注我這一層要幹什麼、返回什麼,至於我的下一層(規模減1),我不管,我就是甩手掌櫃
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    if (l1 == null) {
        return l2;
    } else if (l2 == null) {
        return l1;
    } else if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    } else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
}
  • 如果L1空或L2空,我直接返回L1或L2就行,這很好理解
  • 如果L1第一個元素小於L2的? 那我得把L1的這個元素放到最前面,至於後面的那串長啥樣 ,我不管。我只要接過下級員工幹完活後給我的包裹, 然後把我幹的活附上去(令L1->next = 這個包裹)就行
  • 這個包裹是下級員工幹的活,即merge(L1->next, L2)
  • 我該返回啥?
    • 現在不管我的下一層幹了什麼,又返回了什麼給我, 我只要知道,假設我的工具人們都完成了任務, 那我的任務也就完成了,可以返回最終結果了
    • 最終結果就是我一開始接手的L1頭結點+下

上次修改於 2021-12-09