3. 无重复字符的最长子串

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector 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. 等于-1,表示直到目前遍历的下标都没有出现过s[i]start_index值不变
  2. 大于-1,但是小于当前无重复字串头部下标,说明s[i]已经出现过,但不影响当前无重复字串长度,start_index值不变
  3. 大于-1,但大于等于当前无重复字串头部下标,则当前无重复字串必须从char_index_talbe[s[i]]下一个字符开始,start_index=char_index_talbe[s[i]] + 1

其中,1和2可以合并为一种情况,即char_index_talbe[s[i]] < start_index:

情况1和2

情况3则需要更新start_index:

情况3

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

你可能感兴趣的:(3. 无重复字符的最长子串)