美文网首页数据结构和算法分析程序员
求最长无重复字符子串长度

求最长无重复字符子串长度

作者: CLCP | 来源:发表于2018-01-13 11:34 被阅读92次

    给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。

    示例:"aabcb",5

    返回:3

    解题方法:
    从左到右依次求出以每一个字符结尾的字符串的最长无重复子串,取最大值,就是整个字符串 的最长无重复子串。

    具体做法:
    用一个map记录每个字符上一次出现的位置,用一个整型变量pre记录以上一个字符结尾的字符串的最长无重复子串长度。在遍历字符串时,每一步都做如下操作:

    1. 取出该字符上一次出现的位置,记为last_pos,如果该字符第一次出现,则该值为-1
    2. 计算出以上一个字符结尾的字符串的最长无重复子串起始位置,记为pre_last_pos该值为i-pre
    3. 比较last_pos和pre_last_pos,如果last_pos在pre_last_pos的左边,则当前位置的最长无重复子串最多取到pre_last_pos的位置,即pre + 1,否则可以取到ast_pos右边的位置,即i - last_pos

    实现代码(c++):

    int longestSubstring(string A, int n) {
        map<char, int> pos;
        int pre = 0;
        int str_len = 0;
        for (int i = 0; i < n; i++) {
            map<char, int>::iterator it = pos.find(A[i]);
            int last_pos = it == pos.end() ? -1 : it->second;
            int cur_len = last_pos >= i - pre ? i - last_pos : pre + 1;
            pre = cur_len;
            str_len = cur_len > str_len ? cur_len : str_len;
            pos[A[i]] = i;
        }
        return str_len;
    }
    

    相关文章

      网友评论

        本文标题:求最长无重复字符子串长度

        本文链接:https://www.haomeiwen.com/subject/orqcoxtx.html