目标很简单 - 找到最长的子串而不重复字符,这里是代码:
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)。但我对这种方法感到困惑,尽管我想出了一些要理解的例子,有人可以给我一些提示或想法吗?
答案 0 :(得分:0)
它正在做的是记录上次看到每个角色的位置 当您单步执行时,它会占用每个新遇到的字符,并且非重复的长度至少会回到最后看到的那个,但是对于未来的索引不能再往返,因为我们现在看到了重复。
所以我们维护idx,这是最新出现的最高起始副本的起始索引,它是最长非重复序列开始的候选者。
我确定ans = max()
代码代码会稍微优化一下,因为在遇到新的副本之后,你必须从那个副本的开头起至少一个字符才能再次改进。您仍然需要完成维护dic和idx的其余工作,但是您可以避免针对一些迭代的ans的特定测试。但是,你必须做很多展开才能受益。