iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 2

經典LeetCode 3. Longest Substring Without Repeating Characters

  • 分享至 

  • xImage
  •  

今天我們來解一道 LeetCode 的經典題目:Longest Substring Without Repeating Characters。這道題目考驗字串處理的能力,如何有效率地搜尋和處理重複字元。

題目:
給定一個字串 s,請你找出其中不含重複字元的最長子串的長度。

範例:

輸入:s = "abcabcbb"
輸出:3
解釋:由於無重複字元的子串是 "abc",所以答案是 3。

解題思路

這題可以使用滑動視窗(Sliding Window)來解,滑動視窗核心思想是使用兩個指標來表示目前視窗的範圍,然後動態調整這個視窗來找到最佳解。

這邊同時利用一個不重覆的容器 unordered_set 來存放目前視窗裡的不重複的字元,

一開始移動 right 指標來增加視窗大小,然後判斷是否遇到重複的字元,這裡用 set.find(c) == set.end() 來判斷是否重複,用 set.count(c) == 0 也可以。

沒有重複就一直移動 right 指標,並在 set 加入字元,然後更新不重複最大長度 maxlen

當遇到重複時,set 就移除重複字元,然後移動 left 指標縮小視窗。

實作:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> set;
        int maxlen = 0;
        int left = 0, right = 0;
        while (right < s.size()) {
            if (set.find(s[right]) == set.end()) { // 無重複
                set.insert(s[right]);
                maxlen = max(right-left+1, maxlen);
                right++;
            } else { // 有重複
                set.erase(s[left]);
                left++;
            }
        }
        return maxlen;
    }
};

參考:
#3. Longest Substring Without Repeating Characters


上一篇
經典LeetCode 1. Two Sum
下一篇
經典LeetCode 217: Contains Duplicate
系列文
刷經典 LeetCode 題目80
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言