面试题48:最长不含重复子串的子字符串

面试题48:最长不含重复子串的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
// 滑动窗口
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int len=s.size();
        if(len==0)
            return 0;
        vector<int> hash(128,-1);	// 用数组创建哈希表
        int left=0,right=0;
        int maxLen=0;
        while(right<len)
        {
            if(hash[s[right]] != -1)
                left=std::max(left,hash[s[right]]+1);	// left为 "不含重复字符的字符串的第一个字符"在原字符串s中的下标,right为当前"不含重复字符的字符串的最后一个字符"在原字符串s中的下标,如果重复的字符的下标位置在当前"不含重复字符的字符串"中,则left下标要更新为该重复字符的下一个字符的位置(下标位置+1)。否则,left不需要更新,因为重复字符不在当前"不含重复字符的字符串"中。
            hash[s[right]] = right;	//  更新哈希表(遍历每个字符,都要更新该字符 最后在字符串s中出现的位置)
            maxLen = std::max(maxLen,right-left+1);
            right++;
        }
        return maxLen;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值