求字符串的最长无重复字符子串(C++)

本文介绍了一种求解字符串中最长无重复字符子串长度的高效算法,采用O(N)时间复杂度与O(M)空间复杂度实现,通过记录字符最后出现的位置优化遍历过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

         给定一个字符串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++ 函数实现: ```cpp #include <unordered_map> #include <string> using namespace std; int lengthOfLongestSubstring(const string& s) { unordered_map<char, int> charIndexMap; // 记录字符及其最新位置 int maxLength = 0; int start = 0; for (int end = 0; end < s.length(); ++end) { if (charIndexMap.find(s[end]) != charIndexMap.end() && charIndexMap[s[end]] >= start) { start = charIndexMap[s[end]] + 1; } charIndexMap[s[end]] = end; maxLength = max(maxLength, end - start + 1); } return maxLength; } ``` 此函数接收一个 `const string&` 类型参数并返回整数类型的最长不重复子串长度[^4]。该方法的时间复杂度为 O(n),其中 n 是输入字符串长度;空间复杂度取决于不同字符的数量,在最坏情况下可能达到 O(min(m,n)),m 表示 ASCII 字符集大小而 n 则是字符串的最大长度。 对于不同的测试案例,上述代码能够正确处理各种情况下的输入数据,例如当所有字符都相同时(如 `"bbbbbb"`),或者存在多个相同字符的情况(如 `"pwwkew"`)。此外,如果整个字符串本身即为非重复,则会得到等于原字符串长度的结果(如 `"abcdef"`)[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值