计算无重复的最长字符串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列,而不是子串。

public int LengthOfLongestSubstring(string s) {
    if(s == null || s == "") return 0;//安全检测
    int lLength = 0;
    int tempLength = 0;

    Dictionary<char,int> dic = new Dictionary<char,int>();//记录字串中是否有重复
    for(int i = 0;i<s.Length;i++)
    {
        if(dic.ContainsKey(s[i]))
        {
            //有重复的情况
            if(tempLength > lLength)
            {
                lLength = tempLength;//赋予新长度
            }
            tempLength = i - dic[s[i]];//这个是重点,遗弃重复字符及前面的长度
            Dictionary<char,int> nDic = new Dictionary<char,int>();
            for(int j = dic[s[i]]+1;j<=i;j++)
            {
                //保留 重复字符间 的字符在字典中
                nDic.Add(s[j],j);
            }
            dic = nDic;
        }else{
            //无重复,直接加
            dic.Add(s[i],i);
            tempLength++;
        }
    }

    //一路绿灯无重复的情况
    if(tempLength > lLength)
    {
        lLength = tempLength;
    }

    return lLength;
}


这段代码写了挺快的,因为之前就看过思路,睡觉前也构思过了。但是无可避免的还是要提交很多次才能通过。

哈希字典主要记录当前字串的字符和每个字符的位置,当发现重复的时候,很容易得到两个重复字符的下标,两个下标相减就是遗弃重复字符前面后的字串长度了。

例如:abcabcbb,bcab,两个b为1和4,那么4-1=3,刚好为cab字串的长度3


首页 我的博客
粤ICP备17103704号