LeetCode3:Longest Substring Without Repeating Characters

原题链接:传送门

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

题目大意:

给定一个字符串,找到没有重复字符的最长子串,然后返回这个子串的长度。比如“abcabcbb”中没有重复字符的最长子串是“abc”,返回3;“bbbbbbbb”中没有重复字符的最长子串是“b”,返回1。

这个题目的解决思路主要有两个,一个是哈希表,一个是双游标遍历。

由于要找没有重复字符的子串,所以我们要记住当前子串中都出现了什么字符。这里用unordered_set来存储出现的字符。下面是unordered_set的简单介绍,以后再详细了解下。

unordered表示它是无序的,也就是说,容器中的元素没有特别的次序关系,set说明这是一个set容器,也就是说元素的值可以标示对应的元素。然后我们需要两个游标来对字符串进行遍历,一个begin一个end,end游标主动向前移动,每移动一步,就在哈希表中检查end游标对应的字符是否存在,如果不存在,说明当前begin到end之间的子串满足没有重复字符的要求,end可以继续移动;如果end对应的字符在哈希表中已经存在,说明在begin到end之间有一个字符和end对应的字符相同,接下来就需要找到这个字符,由于这个字符在end的左面,这时需要用begin游标来找到这个字符。

begin游标的任务是找到begin到end这一子串中和end对应的字符相等的字符,需要begin逐一检查,如果相同说明找到,可以退出循环;如果不同,说明begin到end之间的子串还不符合条件,因此可以将begin对应的字符从哈希表中删除。

在遍历的过程中,依次更新最大长度,直到遍历完,就可以得到结果。对应的代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size();
        if(n==0)return 0;
        //哈希表,用来存储当前子串中已经出现的字符
        unordered_set<char> is_shown;
        int begin=0;//左游标
        int end=0;//右游标
        int ret=0;//返回结果
        //对整个字符串进行遍历
        while(end<n)
        {
            unordered_set<char>::iterator it;
            //查找end对应的字符是否出现过
            it=is_shown.find(s[end]);
            //出现过
            if(it!=is_shown.end())
            {
                //更新ret的值
                if(ret<end-begin)
                    ret=end-begin;
                //end对应的字符在当前子串中出现过,说明在begin到end之间有一个和s[end]相同,找到它
                while(s[begin]!=s[end])
                {
                    //不同的时候,需要把begin对应的字符从哈希表中删除,因为它已经不再当前子串中了
                    is_shown.erase(s[begin]);
                    begin++;
                }
                //循环结束,此时s[begin]和s[end]相同,向右移一位
                begin++;
            }
            //没出现过,说明当前子串仍然满足条件,并将s[end]添加到哈希表中
            else
            {
                is_shown.insert(s[end]);
            }
            //end右移
            end++;
        }
        //更新ret
        ret=max(ret,end-begin);
        return ret;
    }
};


你可能感兴趣的:(table,hash,Two,Pointers)