leetcode-3. Longest Substring Without Repeating Characters
阿新 • • 發佈:2018-03-23
AR ++i examples 分析 元素 etc nbsp 大於等於 for is a subsequence and not a substring.
1 題目
Given a string, find the length of the longest substring without repeating characters.
給定一個字符串,求該字符串的最長且不含有重復字符的子字符串。
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
2 分析
雙指針的方法,指向子字符串的頭尾。
並且記錄每個字符出現的最大位置。如果最大位置超過了左指針,那麽應該更新max_counts,和左指針。
class Solution { public: int lengthOfLongestSubstring(string s) { // 用來記錄char 出現的最大位置 map<char, int> memo; int max_counts = 0; // 雙指針 int l = 0; int i = 0; for (; i < s.size(); ++i) { // 如果 s[i] 出現過,並且出現的位置大於等於 l ,那麽表示子字符串中包含重復字符了 // 此時計算一次 max_counts. // 並且將 l 指針右移到 重復字符的下一個字符上 if (memo.find(s[i]) != memo.end() && memo[s[i]] >= l) { max_counts = max(i - l, max_counts); l = memo[s[i]] + 1; } else { } // 記錄該字符出現的位置 memo[s[i]] = i; } // 因為max_counts,只有在出現重復字符的時候,更改,因此這裏需要再更新一次 max_counts = max(i - l, max_counts); return max_counts; } };
不用map,使用數組記錄。
class Solution { public: int lengthOfLongestSubstring(string const &s) { short ans = 0; short b = 0; // 使用數組記錄 short l[256]; memset(l, 0xFF, sizeof(l)); for (short e = 0; e < s.size();) { char c = s[e]; short p = l[c]; // 當字符出現的位置,大於左指針b,小於右指針e。那麽 左指針等於字符出現位置+1,否則仍等於左指針 b = (p >= b && p < e) ? p + 1 : b; // 字符出現位置應該是不會大於e的。 l[c] = e > l[c] ? e : l[c]; ++e; // 更新最終結果 ans = (e - b > ans) ? e - b : ans; } return int(ans); } };
仍然是在遍歷每個元素,如果該元素出現的位置大於左指針,那麽就更新max_counts.
3 總結
解題方法:雙指針。
get
leetcode-3. Longest Substring Without Repeating Characters