1. 问题背景与核心思路
在字符串处理中,寻找无重复字符的最长子串是一个经典算法问题。给定一个字符串,我们需要找到其中不包含重复字符的连续子串的最大长度。这个问题看似简单,但涉及字符串遍历、哈希表应用、滑动窗口等多个核心算法概念。
以输入字符串"pwwkew"为例,最长无重复子串是"wke"或"kew",长度为3。解决这个问题的关键在于如何高效地检测重复字符并记录当前子串长度。
注意:ASCII字符共256个(扩展ASCII),但题目中只考虑小写字母时可简化为26个字母的数组。实际工程中需要考虑所有可能字符。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法实现与解析
2.1 暴力解法代码分析
原始代码展示了一种基础的暴力解法思路:
c复制#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main() {
int tem[26] = {0}; // 字母出现标记数组
char str[] = "pwwkew";
int len = strlen(str);
int lengths[len] = {0}; // 存储所有可能子串长度
int length = 0;
for(int i=0; str[i]!='\0'; i++){
tem[str[i] - 'a'] = 1;
length = 1;
for (int j=i+1; str[j]!='\0'; j++){
if(tem[str[j]-'a']==0){
tem[str[j]-'a'] = 1;
length++;
}else{
break;
}
}
lengths[i] = length;
memset(tem,0,sizeof(tem)); // 重置标记数组
}
sort(lengths, lengths+len);
printf("%d", lengths[len-1]);
return 0;
}
2.2 时间复杂度分析
该解法使用双重循环:
- 外层循环遍历每个字符作为子串起点(O(n))
- 内层循环向后扩展直到发现重复(最坏O(n))
- 总体时间复杂度为O(n²),空间复杂度O(n)
实测发现:当字符串长度为10^5时,此解法在普通PC上需要约5秒,无法通过大型OJ系统的测试。
3. 优化解法:滑动窗口技术
3.1 滑动窗口原理
滑动窗口(Sliding
