剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

解题思路:
1.使用《剑指offer》上的解题思路:
2.使用动态规划+哈希表方法。
3.更新规则:f(i)代表以第i个字符为结尾字符的最长不重复字符串长度,此为dp数组(但是代码中没有使用O(n)的空间建立一个数组,由于只需要获得最大长度,使用打擂台的方式获取最大值即可。)

对于第i个字符,如果该字符未在哈希表中出现过,那么f(i)=f(i-1)+1;
如果它在哈希表中出现过,那么分为两种情况:(1)如果它最后一次出现的位置距离第i个字符的位置之差大于f(i),那么
f(i)=f(i-1)+1;(2)如果它最后一次出现的位置距离第i个字符出现的位置小于f(i),那么f(i) = 距离差。
4.position数组记录字符最近一次出现的位置。

易错点:
当按照书上思路写完时:报错heap-use-after-free,发现是 position[s[i]-‘a’]引起的,将其改成 position[s[i]-’ ']即可,原因是用例中的字符可能是字母以外的字符,例如数字,空格,其他符号等。ascci码中第一个可打印字符是空格,用这种方式,不用出现数组索引为负号或者越界的问题了。(越界问题可以扩大position哈希表的容量,我是从26扩大成100即可)

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.length()<=0) return 0;
        int curLength=0;
        int maxLength=0;
        int *position = new int[100];
        for(int i=0;i<100;++i){
            position[i] = -1;
        }
        for(int i=0;i<s.size();++i){
            int prePosition = position[s[i]-' '];
            if(prePosition<0||(i-prePosition)>curLength){
                ++curLength; 
            }else{
                if(curLength>maxLength){
                    maxLength = curLength;
                }
                curLength = i-prePosition;
            }
            position[s[i]-' '] = i;
        }
        if(curLength>maxLength){
            maxLength = curLength;
        }
        delete []position;
        return maxLength;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值