1. 程式人生 > >leetcode-3. Longest Substring Without Repeating Characters

leetcode-3. Longest Substring Without Repeating Characters

AR ++i examples 分析 元素 etc nbsp 大於等於 for

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"

is a subsequence and not a substring.

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