3. Longest Substring Without Repeating Characters

来源:互联网 发布:灯具品牌 知乎 编辑:程序博客网 时间:2024/06/16 06:53

这道题是说,给出一个字符串,求最长的无重复的子字符串长度。

我想到了滑动窗口的方法,但是没有调出来,看了大神的代码,发现用set可以。遍历这个字符串s,如果当前字符在set里面没有找到,说明目前没有出现重复的,则把这个字符加到set里,继续找下一个字符。如果这个字符在set里出现了,那么把s里从left开始一个个删除,直到删到set里找不到这个字符了,说明删到了上一个重复字符出现的位置的下一个位置。那么把这个字符放进去就不重复了,然后继续重复上面的操作。set里面最长的长度就是答案。

class Solution {public:    int lengthOfLongestSubstring(string s) {        set<int> sets;        int left = 0, right = 0, res = 0;        while(right < s.size()){            if(sets.find(s[right]) == sets.end()){                sets.insert(s[right++]);                res = max(res, right - left);            }            else{                sets.erase(s[left++]);            }        }        return res;    }};
看到别人还用了哈希表:哈希表里存<char, int>,或者用一个256的数组代替哈希表。表里存每个字符上一次出现在s中的位置。再定义一个left表示无重复子字符串的开头,如果遍历到一个字符,没有在哈希表里出现,说明没有出现过,则加入哈希表里,记录当前位置。如果在哈希表里出现了,而且出现的位置大于left,说明left到i中有重复的了,所以把left更新到上次出现位置的下一个位置,并且修改哈希表的这个字符最后一次出现的位置。我的代码:

class Solution {public:    int lengthOfLongestSubstring(string s) {        unordered_map<char, int> m;        int left = 0, res = 0;        for(int i = 0; i < s.size(); ++i){            //cout << s[i] << endl;            if(m.find(s[i]) == m.end() || m[s[i]] < left){                m[s[i]] = i;                if(i - left + 1 > res)                    cout << i << " " << left << endl;                res = max(res, i - left + 1);            }            else{                if(left <= m[s[i]]){                    left = m[s[i]] + 1;                    m[s[i]] = i;                }                else                    m[s[i]] = i;            }        }        return res;    }};

大神代码:

我们还是建立一个256位大小的整型数组来代替哈希表,这样做的原因是ASCII表共能表示256个字符,所以可以记录所有字符,然后我们需要定义两个变量res和left,其中res用来记录最长无重复子串的长度,left指向该无重复子串左边的起始位置,然后我们遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,i - left +1,其中i是最长无重复子串最右边的位置,left是最左边的位置,还有一种情况也需要计算最长无重复子串,就是当哈希表中的值小于left,这是由于此时出现过重复的字符,left的位置更新了,如果又遇到了新的字符,就要重新计算最长无重复子串。最后每次都要在哈希表中将当前字符对应的值赋值为i+1

class Solution {public:    int lengthOfLongestSubstring(string s) {        int m[256] = {0}, res = 0, left = 0;        for (int i = 0; i < s.size(); ++i) {            if (m[s[i]] == 0 || m[s[i]] < left) {                res = max(res, i - left + 1);            } else {                left = m[s[i]];            }            m[s[i]] = i + 1;        }        return res;    }};



阅读全文
0 0
原创粉丝点击