Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc"
, with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b"
, with the length of 1.
给定一个字符串,计算其最长子串。
最简单的暴力遍历法我们暂且不表,其复杂度为O(n^2)。在此我们讨论一种更优雅的方式来实现,对于给定的字符串,我们在查找其最长子串时实际是维护一个滑动窗口,窗口内没有重复的元素,滑动窗口的尺寸最大时,即为我们所求。下面我们讨论窗口滑动时的情况:
1、窗口滑动,出现的字符都保存起来,记录其最后出现的位置
2、当前遍历的字符没有出现在窗口中,则直接加入到窗口,计算窗口尺寸
3、当前字符出现在窗口中,则更新当前字符出现的位置,并计算最新尺寸
我们使用一个256大小的数组来存放所有ASCII码字符出现的最后位置,最后实现的代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> m(256, -1);
int res = 0, left = -1;
for (int i = 0; i < s.size(); ++i) {
left = max(left, m[s[i]]);
m[s[i]] = i;
res = max(res, i - left);
}
return res;
}
};