LC 3 && LC340. 易錯(cuò)點(diǎn)分析 Longest Substring with At Most K Distinct Characters

3. Longest Substring Without Repeating Characters
340. Longest Substring with At Most K Distinct Characters
這兩道都是經(jīng)典題目,思路是sliding window + hashMap/HashSet.
具體3用HashSet, 340用HashMap。
題目不難,但不容易一次寫(xiě)對(duì)。我在面試的時(shí)候就忘了一點(diǎn)。
下面分析一下這兩道題容易錯(cuò)的地方。
1。 分析各種情況時(shí),往往忘了在某個(gè)case把字母放入HashSet, 光記得刪了。
2。算長(zhǎng)度時(shí)slow, fast pointer忘了+1 了。
3。 slow, fast pointer忘了移動(dòng)了。。 為了避免出錯(cuò),最好把fast++放在循環(huán)的最后,但一開(kāi)寫(xiě)while loop就寫(xiě)上。(用continue時(shí)要小心)
4。 Set, HashMap這些不要直接叫set, map的,要取有意義的名字,不然容易成為掛點(diǎn)

    public int lengthOfLongestSubstringKDistinct(String s, int k) {
        Map<Character, Integer> visitedTimes = new HashMap<>();
        int ans = 0;
        int slow = 0, fast = 0;
        if (k == 0) return 0;
        while (fast < s.length()) {
            char ch = s.charAt(fast);
            if (visitedTimes.containsKey(ch)) {
                visitedTimes.put(ch, visitedTimes.get(ch) + 1);
            } else if (visitedTimes.size() < k) {
                visitedTimes.put(ch, 1);
            } else { 
                while (slow < fast) {
                    char ch2 = s.charAt(slow++);
                    if (visitedTimes.get(ch2) == 1) {
                        visitedTimes.remove(ch2);
                        break;
                    } else {
                        visitedTimes.put(ch2, visitedTimes.get(ch2) - 1);
                    }
                }
                visitedTimes.put(ch, 1); //別忘了加這個(gè)。
            }
            ans = Math.max(fast - slow + 1, ans);
            fast++;  //一開(kāi)寫(xiě)while 就寫(xiě)在這里,但要注意如果某次用了continue語(yǔ)句要++
        }
        return ans;
    }

LC 3的代碼

public int lengthOfLongestSubstring(String s) {
        Set<Character> visitedChars = new HashSet<>();
        int slow = 0, fast = 0;
        int ans = 0;
        while (fast < s.length()) {
            if (visitedChars.add(s.charAt(fast))) {
                fast++;
                ans = Math.max(ans, fast - slow);
            } else {
                while (s.charAt(slow) != s.charAt(fast)) {
                    visitedChars.remove(s.charAt(slow++));
                }
                slow++;
                fast++;
            }
        }
        return ans;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容