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(返回值)中,所以我们可能(因为我们也应该比较)丢弃它,对吗?对不起,我无法在一个段落中理解您的问题。