码迷,mamicode.com
首页 > 其他好文 > 详细

第三题:Longest Substring Without Repeating Characters

时间:2015-02-09 18:33:02      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:


题目链接:题目链接


找到最长不重复子串,使用hash方法来做是极好的!遍历string,找到一个字符,然后会判断这个字符是不是已经在当前的这个子串中,这个使用hash方法,因为可见字符最多256个,那么使用hash[256]就可以!初始化为-1,保存的是相应的字符在string中的位置。如果遇到在前面存在的字符,那么需要将这个子串的start位置移动到已经存在的位置后面一位,然后继续遍历,直到遍历结束。

具体看下面的代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int max_len = 0, start = 0, i = 0, n = s.length(), len = 0;
        int hash_elem[256];

        memset(hash_elem, -1, sizeof(hash_elem));

        while (i < n){
            // hash_elem[s[i]] < 0说明:是新的字符,之前没有出现过
            // hash_elem[s[i]] < start说明:字符出现过,但是已经作废
            // 例如: abcdb
            // 我们遍历到abcd,然后发现b重复,那么后面其实是从c开始,
            // 但是a由于b的影响也就被作废了,但是这个时候a在hash_elem中
            // 的下标还是0,但是小于start,所以相当于也是合法的字符
            //
            if (hash_elem[s[i]] < 0 || hash_elem[s[i]] < start)
                ++len;
            else{
                max_len = max_len > len ? max_len : len;
                // 注意吧前面的字符减掉
                //
                len -= hash_elem[s[i]] - start;
                // 新的位置从重复字符的位置后面一位开始
                //
                start = hash_elem[s[i]] + 1;
            }

            hash_elem[s[i]] = i;
            ++i;
        }

        return max_len > len ? max_len : len;
    }
};


第三题:Longest Substring Without Repeating Characters

标签:

原文地址:http://blog.csdn.net/shanshanpt/article/details/43672039

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!