Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Leetcode--3查找不重复字符的最长子字符串_String_Algorithm_C++11 - Fatal编程技术网

String Leetcode--3查找不重复字符的最长子字符串

String Leetcode--3查找不重复字符的最长子字符串,string,algorithm,c++11,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

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

 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;
    }

};
类解决方案{
公众:
int lengthOfLongestSubstring(字符串s){
int ans=0;
int-dic[256];
memset(dic,-1,sizeof(dic));
int len=s.size();
intidx=-1;
对于(int i=0;iidx)
idx=dic[c];
ans=最大值(ans,i-idx);
dic[c]=i;
}
返回ans;
}
};

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

它所做的是记录每个字符最后一次出现的位置。
当你一步一步地通过时,它会接受每一个新遇到的字符,并且不重复的长度至少可以追溯到上次看到的长度,但是对于未来的索引,不能再追溯,因为我们现在已经看到了一个重复

因此,我们在idx中维护,最近出现的最高起始重复的起始索引,它是最长非重复序列起始的候选


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

这个问题尚不清楚。你能详细说明一下吗?你试过了吗?它达到你的目标了吗?你要什么?另外:您为这个C++11添加了标签,但在我看来非常“C风格”。@kebs至于C++11,我发现VS2015支持这个标准。但是我想强调的是,为什么我把这个当作一个标签,只是因为我有一支笔,也许我应该把它改成C++……我真的不知道C++标准的不同之处,我似乎有一些想法。我认为IF结构的功能是如果我们能满足它,那么这个字符目前已经存在于我们维护的subing(返回值)中,所以我们可能(因为我们也应该比较)丢弃它,对吗?对不起,我无法在一个段落中理解您的问题。