力扣第三题 无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)

话不多说 直接上代码与注释。方法可能不是最好的,但是自己写的,记录一下。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int res = 0; //返回的结果 默认0因为本题可能出现空字串
        int index = 0; //用来记录当前无重复子串的长度
        int begin = 0; //用来记录当前无重复子串的起始位置
        unordered_map<char,int> map; //记录字符上一次出现的位置
        //遍历一遍字符串 挨个对比
        for(int i = 0; i < s.size(); i++) {
            //看这个元素是否出现过,若没有出现,则不存在重复问题,子串长度直接加。
            if(map.find(s[i]) == map.end()){ 
                index++;
                map.insert(make_pair(s[i],i));
                res = res>index?res:index; //更新当前子串长度
            }
            //若元素出现过,看是否在该子串内,若不在,则可以继续更新子串长度同时更新字符位置
            else{
                if(begin > map[s[i]]){
                    index++;
                    res = res>index?res:index;
                }
                //若元素出现过,并且在当前子串中,则更新字符位置与子串起始位置,计算新子串长度
                else{
                    begin = map[s[i]] + 1; //更新子串起始位置
                    index = i - begin + 1; //重新计算子串长度
                }
                map[s[i]] = i; //更新字符位置
            }
        }
        return res;
    }
};

 当然这道题同样可以不适用哈希表进行解答,可以使用数组作为哈希表的平替。因为字符在做数组下标时会自动替换为ASCII码表中对应的值,所以可以使用int arry[128]来替代哈希表。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值