【问题标题】:Leetcode--3 find the longest substring without repeating characterLeetcode--3 查找最长的子串而不重复字符
【发布时间】:2018-10-18 17:22:39
【问题描述】:

目标很简单——找到最长的子串而不重复字符,代码如下:

 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)。但是我对这种方法感到困惑,虽然我想出了一些例子来明白了,谁能给我一些提示或想法?

【问题讨论】:

  • 问题不清楚。你能详细说明一下吗?你试过这个,它达到你的目标了吗?你在问什么?另外:你标记了这个 C++11,但对我来说看起来非常“C 风格”。
  • @kebs 至于c++11,我发现VS2015支持这个标准。但我想强调一下,为什么我把它当成一个标签只是因为我有一个笔误,也许我应该把它换成C++......实际上我不太了解这两者之间的区别C++ 的标准

标签: string algorithm c++11


【解决方案1】:

它所做的是记录每个角色最后一次出现的位置。
当您逐步完成时,它需要每个新遇到的字符,并且非重复的长度至少可以追溯到最后一次看到的长度,但是对于未来的索引不能再进一步回溯,因为我们现在已经看到了重复。

所以我们在 idx 中维护最近看到的最高起始副本的起始索引,它是最长非重复序列开始的候选者。

我确定ans = max() 代码代码会稍微优化,因为遇到新的重复项后,您必须从该重复项的开头至少向前推进 ans 字符,然后才能再次改进 ans。您仍然需要维护 dic 和 idx 的其余工作,但您可以避免对 ans 进行特定测试以进行几次迭代。不过,您必须进行大量展开才能受益。

【讨论】:

  • 我好像有一些想法。而且我认为If结构的功能是如果我们能满足它,那么这个字符当前已经存在于我们维护的subing(返回值)中,所以我们可以(因为我们也应该比较)扔掉它,对吗?
  • 对不起,我无法用一个段落来理解你的问题。
猜你喜欢
  • 2017-06-20
  • 1970-01-01
  • 2023-03-31
  • 2016-08-11
  • 2021-12-26
  • 2020-12-09
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多