Leetcode - 3找到最长的子串而不重复字符

时间:2018-05-08 17:13:22

标签: string algorithm c++11

目标很简单 - 找到最长的子串而不重复字符,这里是代码:

 class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int ans = 0;
        int dic[256];
        memset(dic, -1, sizeof(dic));
        int len = s.size();
        int idx = -1;

        for (int i = 0;i < len;i++) {
            char c = s[i];
            if (dic[c] > idx)
                idx = dic[c];

            ans = max(ans, i - idx);

            dic[c] = i;
        }
        return ans;
    }

};

从它简洁的表达,我认为这是一种高性能的方法,我们可以得到它的时间复杂度只是O(n)。但我对这种方法感到困惑,尽管我想出了一些要理解的例子,有人可以给我一些提示或想法吗?

1 个答案:

答案 0 :(得分:0)

它正在做的是记录上次看到每个角色的位置 当您单步执行时,它会占用每个新遇到的字符,并且非重复的长度至少会回到最后看到的那个,但是对于未来的索引不能再往返,因为我们现在看到了重复。

所以我们维护idx,这是最新出现的最高起始副本的起始索引,它是最长非重复序列开始的候选者。

我确定ans = max()代码代码会稍微优化一下,因为在遇到新的副本之后,你必须从那个副本的开头起至少一个字符才能再次改进。您仍然需要完成维护dic和idx的其余工作,但是您可以避免针对一些迭代的ans的特定测试。但是,你必须做很多展开才能受益。