https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> char_index_talbe(128, -1);
int max_len(0);
int start_index(0);
for (int i = 0; i < s.length(); ++i) {
start_index = max(start_index, char_index_talbe[s[i]] + 1);
char_index_talbe[s[i]] = i;
max_len = max(max_len, i - start_index + 1);
}
return max_len;
}
};
start_index
记录当前无重复字串的开始下标,向量char_index_talbe
记录每个字符在s
中的下标,初始化全部为-1,i
为当前遍历到字符,char_index_talbe[s[i]]
有以下三种情况:
- 等于-1,表示直到目前遍历的下标都没有出现过
s[i]
,start_index
值不变 - 大于-1,但是小于当前无重复字串头部下标,说明
s[i]
已经出现过,但不影响当前无重复字串长度,start_index
值不变 - 大于-1,但大于等于当前无重复字串头部下标,则当前无重复字串必须从
char_index_talbe[s[i]]
下一个字符开始,start_index=char_index_talbe[s[i]] + 1
其中,1和2可以合并为一种情况,即char_index_talbe[s[i]] < start_index
:

情况3则需要更新start_index
:

代码统一了所述三种逻辑,且不需要加 if 判断
网友评论