清丰网站建设费用,自适应网站建设优化建站,可以用来做视频网站的视频外链吗,wordpress 幻灯片 文章这里我们可以建立一个HashMap#xff0c;建立每个字符和其最后出现位置之间的映射#xff0c;然后我们需要定义两个变量res和left#xff0c;其中res用来记录最长无重复子串的长度#xff0c;left指向该无重复子串左边的起始位置的前一个#xff0c;由于是前一个#xff…这里我们可以建立一个HashMap建立每个字符和其最后出现位置之间的映射然后我们需要定义两个变量res和left其中res用来记录最长无重复子串的长度left指向该无重复子串左边的起始位置的前一个由于是前一个所以初始化就是-1然后我们遍历整个字符串对于每一个遍历到的字符如果该字符已经在HashMap中存在了并且如果其映射值大于left的话那么更新left为当前映射值。然后映射值更新为当前坐标i这样保证了left始终为当前边界的前一个位置然后计算窗口长度的时候直接用i-left即可用来更新结果res。
这里解释下程序中那个if条件语句中的两个条件m.count(s[i]) m[s[i]] left因为一旦当前字符s[i]在HashMap已经存在映射说明当前的字符已经出现过了而若m[s[i]] left 成立说明之前出现过的字符在我们的窗口内那么如果要加上当前这个重复的字符就要移除之前的那个所以我们让left赋值为m[s[i]]由于left是窗口左边界的前一个位置这也是left初始化为-1的原因因为窗口左边界是从0开始遍历的所以相当于已经移除出滑动窗口了。举一个最简单的例子aa当i0时我们建立了a-0的映射并且此时结果res更新为1那么当i1的时候我们发现a在HashMap中并且映射值0大于left的-1所以此时left更新为0映射对更新为a-1那么此时i-left还为1不用更新结果res那么最终结果res还为1正确代码如下
class Solution { // adaad
public:int lengthOfLongestSubstring(string s) {int res 0, left -1, n s.size();unordered_mapint, int m;for (int i 0; i n; i) {if (m.count(s[i]) m[s[i]] left) {left m[s[i]]; }m[s[i]] i;res max(res, i - left); }return res;}
};