Leetcode-3

Leetcode-3题解

Posted by 顾小五 on September 12, 2018

大致题意

Longest Substring Without Repeating Characters

就是求最长不含相同符号的子串

解题思路

这题感觉最开始想到的当然是爆爆爆爆爆爆力

感觉暴力太鬼畜了

所以想二分求最大长度

但是还是TLE….

所以说还是很弱智= =!

去网上看了看,发现这题有非常巧妙的解法

解答参考了这篇博客

这篇博客的思路是

就是开一个数组然后记录每个字符上次出现的位置,然后一旦这个字符出现的位置不等于初始值-1,那么就证明这个字符出现过。然后从初始字符串记录值向后移动一位。

但是要注意的是,需要设置一个初始位置记录值_start,当前子串长度就等于 当前位置 i - _start


class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int pos[256], _start = -1, len = s.length(),_ans = 0;
        memset(pos, -1, sizeof(pos));
        for (int i = 0; i < len; i++) {
            if (pos[s[i]] > -1) {   //该字符出现过
                _start = pos[s[i]];
            }
            _ans = max(_ans, i - _start);
            pos[s[i]] = i;
        }
        return _ans;
    }
};

根据如上思路,可以写出这样的代码,但是这样写还是不对,原因在if条件判断,不应该大于-1而是大于_start,因为判断该字符串是否包含在子串是从_start开始,如果从-1开始就是从str[0]开始

完整解答