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