LeetCode 3.Longest Substring Without Repeating Characters

题目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

分析与解答:

读完题目我就想到了算法导论里面的最大子数组问题。此题与之类似,可以用分治法,但复杂度是O(nlogn)。书上还写了,这个问题是有线性时间的解法的,我所采用的方法就和它类似。

一开始的想法是,设定两个指针indexHead和indexEnd,指向子串的开始和结尾。indexEnd逐个移动,考察s[indexEnd]是否在子串中有重复。如果没有重复,就将子串长度加1;如果重复了,就找出是在哪个位置重复的,然后将indexHead设置到该位置之后的一个位置,并更新子串。此方法的正确性很容易证明,就不写了。

因为需要频繁判断某个字符在不在子序列中,所以可以采用哈希表,它的插入和查找都是O(1)复杂度。但转念一想,字符的ASCII码总共也就256个,就开一个长度256的数组,记录每个字符最后出现的位置即可。判断重复时如果出现的位置在indexHead后面,即是重复的。需要注意的是:

其实如果indexHead后面的字符个数少于已知的longestStrLen的话,就没有必要再进行下去了。

//Longest Substring Without Repeating Characters 
//by rickard
//2015.1.23
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    int sLen = s.size();
    int totalChar[256];//用来保存每个字符最后一次出现的位置
    memset(totalChar,-1,sizeof(totalChar));
    int indexHead=0,indexEnd=0,subStrLen = 0,longestStrLen = 0;
    while(indexEnd < sLen)
    {
        if(sLen - 1 - indexHead < longestStrLen)//这种情况下没有再做下去的必要了
        {
            return longestStrLen;
        }
        int intChar =(int)s[indexEnd];//将char转换为int型整数
        if(totalChar[intChar]>=indexHead)//最后一次出现的地方在subStr之内,证明此字符重复了
        {
            subStrLen -= totalChar[intChar]-indexHead;
            indexHead = totalChar[intChar]+1;
            totalChar[intChar] = indexEnd;
        }
        else//没重复,就更新totalChar数组
        {
            totalChar[intChar] = indexEnd;
            if(++subStrLen>longestStrLen)
            {
                longestStrLen = subStrLen;
            }
        }
        indexEnd++;
    }
    return longestStrLen;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值