https://leetcode.com/problems/longest-substring-without-repeating-characters
Solution
使用 sliding window + set 就能解決這個問題,只是一開始被前幾天解的 dp 題 (找「最長回文子字串 longest palandromic substring」) 擾亂思緒,往列舉出所有長度的子字串,再一個個的檢查是否 valid 的方向思考。
不過,這題 input string 長度是 10⁴,用列舉法的 TC 就至少是 O(n³),肯定會 TLE。
其實這題並沒有那麼複雜,可以用 sliding window 維護兩個 pointer (left & right),由左往右慢慢更新。並且把當前的 window 範圍內出現過的 character 紀錄在 set 裡面。
遇到沒看過的字元,就 right += 1。
遇到看過的字元,就持續 left +=1,直到當前的 s(left, right) 不包含重複的字元。
Note
std::set
// 初始化
std::set<int> s{1, 3, 4};
int arr\[\] = \[1, 3, 5, 5\];
std::set<int> s(arr, arr+4); // 從 c-style 的 array 初始化
// 插入
s.insert(1);
// 查找
s.count(1); // 回傳純量,0 or 1
s.find(1); // 回傳 iterator,沒找到會回傳 s.end()
// 刪除
s.erase(1);
// 清空
s.clear();
std::unordered_set
TBD
Refs
medium-to-markdown@0.0.3 convert node index.js https://medium.com/@flyotlin/leetcode-6-zigzag-conversion-70a90b71fb05