Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
这题如果想知道是否有重复字符,则扫描每个字母时必定需要有记录操作。所有字符可以放在一个数组里,以字符作为下标存储它们最后一次出现的位置。如果某个字符已经有记录了,而且这个字符的位置在子串左边界的右边(含左边界),说明字符重复了,那么子串的左边界要重新赋值为重复字符的位置的下一个位置,用于把最左边的重复字符去掉。每扫描一个字母就更新一下子串的最长长度。
代码如下:
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) { 4 int max_size(0), left_bound(0), str_size(s.length()); 5 int last_positions[256]; 6 memset(last_positions, -1, sizeof(last_positions)); 7 8 for (int i = 0; i < str_size; ++i){ 9 if (last_positions[s[i]] >= left_bound){10 left_bound = last_positions[s[i]] + 1;11 }12 last_positions[s[i]] = i;13 max_size = max(max_size, i - left_bound + 1);14 }15 return max_size;16 }17 };