题目大意
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路
创建一个长度为256的数组,用来记录每个字符遍历到i位置时,最后一次出现的位置。在每次遍历时,有一个左边界left,表示从left到i位置之间的字符都是不重复的。
因此遍历到位置i的时候,首先在nums数组中找到上一次该元素出现的位置,然后left=max(left, nums[s[i]])确定以i位置为结尾时的左边界(max的原因,例如"abba",当遍历到最后一个元素’a’时,上一个’a’出现的位置时0,然而遍历到最后一个’b’时,左边界left是1,因此当前’a’与前一个’a’中有重复元素)。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size() == 0) return 0;
int res = 0, left = -1;
vector<int> nums(256, -1);
for (int i = 0; i < s.size(); i++)
{
left = max(left, nums[s[i]]);
res = max(res, i - left);
nums[s[i]] = i;
}
return res;
}
};