请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2:
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3:
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
利用哈希表存储每次字符出现的索引,当前字符如果之前出现过,那么看与之前字符的距离是否在新计算的字符串长度内,如果不在 则不影响当前子串,如果在则更新长度值和当前子串长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)return 0;
if(s[0]==' ')return 1;
int maxcount=0;//最大长度
int curcount=0;//当前子串长度
vector<int>word(128,-1);//存放字符出现的下标
for(int i=0;i<s.size();i++)
{
int previndex=word[s[i]]; //当前字符之前出现索引
if(previndex<0||i-previndex>curcount)//如果索引为-1 则第一次出现,或者之前出现的位置 不在当前子串里
{
curcount++;
}
else
{
if(curcount>maxcount)
{
maxcount=curcount;
}
curcount=i-previndex;//更新子串长度
}
word[s[i]]=i;//更新字符出现位置
}
if(curcount>maxcount)
{
maxcount=curcount;
}
return maxcount;
}
};