LeetCode 3. Longest Substring Without Repeating Characters 滑动窗口

一、题目

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 asubstring,"pwke" is a subsequence and not a substring.

题意:给定一个字符串,找出不重复字母连续最长子串的长度。

注意:一旦遇到字符串的题,一定要敏感,字符集的范围,字母?数字+字母?ASCII?

         查找重复字符还需要考虑大小的区别。

思路:和209类似采用滑动窗口的思路。在[l...r]区间中表示不重复的字符集,为了扩大当前的字符集,加载一位新的元素时要判断新元素是否在[l...r]中,若不在扩大r+1,若在就将左边界l减至重复元素之后。在此期间不断更新维护字符区间的长度。

如何判断新的元素是否在字符集区间呢?遍历查找?find?这里有个小技巧,查表

预定义一个256大小的数组来维护字符集区间内元素出现的频率freq[256]初始为0,当加入1个元素对应的元素下标+1,当从字符集中删除一个元素对应删除元素下标需要-1,最终通过查表来看该元素是否在字符集空间中。

LeetCode 3. Longest Substring Without Repeating Characters 滑动窗口_第1张图片

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

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int l = 0,r = -1; //初始状态[left...right]设置为无效
        int res = 0;             //因为是找最大子串,初始值为0
        int freq[256]={0};
        while(l

LeetCode 3. Longest Substring Without Repeating Characters 滑动窗口_第2张图片

你可能感兴趣的:(LeetCode,LeetCode数组字符串问题)