求字符串的最长无重复字符子串(C++)
来源:互联网 发布:linux漏洞公布 编辑:程序博客网 时间:2024/05/18 03:57
题目:
给定一个字符串str,返回str的最长无重复字符子串的长度。
如:"abcd" 返回4 "abcb" 返回3
要求:若字符串的长度为N 算法的时间复杂度为O(N)。
思路:
下面给出的算法 时间复杂度为O(N) 空间复杂度为O(M) 其中 :
N为字符串的长度 M是字符串中字符编码的范围(ASCII码最大值)。
首先定义以下2个变量:
mp<char, int> —— 存储某个字符最近出现的位置。
pre —— 表示遍历到str[i]时 以str[i - 1]字符结尾的情况下最长无重复子串开始的前一个位置。
maxSubLen —— 记录以每个字符结尾的情况下,最长无重复子串长度的最大值。
初始时 pre = -1 maxSubLen = 0
mp[str[i]] 表示遍历完str[0]-str[i-1]后 str[i]字符最近一次出现的位置 设为A。
pre + 1 表示以str[i - 1]字符结尾的情况下 最长无重复子串的开始位置。
讨论:
A > pre 以str[i]结尾的最长无重复子串范围即为: str[A + 1] ~ str[i]
A <= pre 以str[i]结尾的最长无重复子串范围即为: str[pre + 1] ~ str[i]
令:maxEdIdx = max(A, pre);
执行完上述操作后,更新pre【pre 和 A的较大值】 更新maxSubLen【maxSubLen 和maxEdIdx 的较大值】
重复上述操作,直至所有字符遍历完。
贴代码:
<span style="font-size:12px;">#include <iostream>#include <string>using namespace std;int longestSubstring(string A, int n) {int mp[256];memset(mp, -1, 256 * sizeof(int));int pre = -1, maxSubLen = 0;for (int i = 0; i < n; ++i){pre = max(pre, mp[A[i]]);maxSubLen = max(maxSubLen, i - pre);mp[A[i]] = i;}return maxSubLen;}int main(void){string str = "aabcdb";cout<<longestSubstring(str, str.length())<<endl;return 0;}</span>
- 求字符串的最长无重复字符子串(C++)
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- c 求字符串内无重复字符的最长子串
- 2.求最长无重复字符子串和求最长回文子串的算法
- 查找字符串中最长无重复字符的子串
- 字符串中最长无重复字符的子串
- 找到字符串的最长无重复字符子串
- 找到字符串中无重复最长的字符子串
- 找到字符串的最长无重复字符子串
- 求字符串中不重复字符的最长子串
- 最长无重复字符的子串
- 最长无重复字符的子串
- 【Leetcode】Rotate Array
- servlet复习(一)Servlet API
- CodeForces 586E Alice, Bob, Oranges and Apples 水题
- javascript新建对象及基本数据类型
- 超实用的jQuery代码段 - jQuery实现Animate动画
- 求字符串的最长无重复字符子串(C++)
- iOS调试常见错误汇总 如:symbol(s) not found for architecture x86_64
- Delete Node in a Linked List
- 13、Roman to Integer
- MySQL++简介
- Map集合的三种遍历方式
- uva 12105——Bigger is Better
- hdoj 1148 - Mad Counting 【水题(模拟)】【周赛】
- WinForm实现股票实时查询小程序