剑指 Offer 48. 最长不含重复字符的子字符串

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • s.length <= 40000

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Solution 1

快慢双指针,用哈希表存储两指针直接出现的字符

import java.util.*;

class Solution {
    public int lengthOfLongestSubstring(String s) {
        {
            int start = 0, end = 0, max_len = 0;
            // start指向不重复子串的开头,end指向不重复子窜的末尾
            Map<Character, Integer> hashTable = new HashMap<>();
            while (end < s.length()) {
                Character key = s.charAt(end);
                if (!hashTable.containsKey(key) || hashTable.get(key) == 0) {
                    hashTable.put(key, 1);
                    end++;
                    if (max_len < end - start)
                        max_len = end - start;
                } else {
                    while (hashTable.get(key) == 1) {
                        hashTable.replace(s.charAt(start), 0);
                        start++;
                    }
                }
            }
            return max_len;
        }
    }
}

Solution 2

cpp

#include <string>
using std::string;

class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        bool map[128];
        for (int i = 0; i < 128; i++)
            map[i] = false;
        int len = 0, maxLen = 0, start = 0, end = 0;
        while (start < s.length() && end < s.length())
        {
            char c = s[end++];
            while (map[c] == true)
            {
                map[s[start++]] = false;
                len--;
            }
            map[c] = true;
            len++;
            if (len > maxLen)
                maxLen = len;
        }
        return maxLen;
    }
};