• 【剑指Offer】面试题48. 最长不含重复字符的子字符串


    题目

    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    

    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    

    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    提示:

    • s.length <= 40000

    本题同【LeetCode】3. 无重复字符的最长子串

    思路一:滑动窗口

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            unordered_map<char, int> ump;
            int size = s.size(), res = 0;
            for (int i = 0, j = 0; j < size; ++j) {
                if (ump.find(s[j]) != ump.end()) { //之前出现过
                    i = max(i, ump[s[j]] + 1); //i从相同字符下一个字符开始
                }
                res = max(res, j - i + 1); //计算以当前字符结尾长度
                ump[s[j]] = j;//插入哈希表
            }
            return res;
        }
    };
    

    另一种写法

    每次向前移动结尾指针j,记录当前字符结尾最大长度,如果当前字符在前面出现过,则向前移动开始指针i,否则将当前字符插入哈希表,然后计算最大长度并且指向下一个字符。
    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            unordered_set<int> uset;
            int size = s.size(), i = 0, j = 0, res = 0;
            while (i < size && j < size) {
                if (uset.count(s[j]) > 0) {
                    uset.erase(s[i]);
                    ++i;
                } else {
                    uset.insert(s[j]);                
                    res = max(res, j - i + 1);
                    ++j;
                }
            }   
            return res;
        }
    };
    
  • 相关阅读:
    Beta冲刺(4/4)
    2019 SDN上机第7次作业
    Beta冲刺(3/4)
    Beta冲刺(2/4)
    机器学习第二次作业
    机器学习第一次作业
    软工实践个人总结
    第04组 Beta版本演示
    第04组 Beta冲刺(5/5)
    第04组 Beta冲刺(4/5)
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12569325.html
Copyright © 2020-2023  润新知