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

给定一个字符串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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法字符串系列的第四篇文章,计算给定字符串的最长无重复子串。 这篇文章主要介绍两种方法,一种是基于hash的思想,...
    zero_sr阅读 14,295评论 3 14
  • 最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...
    林大鹏阅读 2,793评论 0 6
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,267评论 0 4
  • 迟来的春光里,我在奉化溪口的小洋房露台上看到了剡溪的一双燕子。 奉化溪口,蒋介石老家,所有景物和这个历史人物几乎都...
    缎子手潘潘阅读 375评论 0 0
  • 西北春天的风总有沙土夹杂,刚洗完的头发就被吹成了灰土色。呼和走在路上,头发吹得乱七八糟,心里盘算着还有几个小区...
    我要是只加菲猫就好了阅读 274评论 0 0