无重复字符的最长子串
- 1. 题目解析
- 2. 讲解算法原理
- 3. 编写代码
1. 题目解析
题目地址:点这里
2. 讲解算法原理
算法的主要思想是使用滑动窗口来维护一个不含重复字符的子串。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记录字符的出现次数。
算法的流程如下:
- 初始化 left、right、len 为0,字符串 s 的长度为 n。同时初始化一个大小为128的数组 hash,用于记录字符的出现次数,初始值都为0。
- 当 right 小于 n 时,执行以下步骤:
- 将 hash[s[right]] 的值加1,表示当前字符进入窗口。
- 当 hash[s[right]] 的值大于1时,表示当前字符在窗口内已经出现过,需要调整窗口的左边界。
- 将 hash[s[left]] 的值减1,表示左边界字符移出窗口。
- 将 left 右移一位。
- 计算当前窗口的长度 right - left + 1,并将其与 len 中的最大值进行比较,更新 len。
- 将 right 右移一位。
- 如果字符串 s 的长度为1,直接返回1,因为只有一个字符。
- 返回 len,即为最长的无重复字符子串的长度。
总体来说,这个算法利用滑动窗口的思想,在遍历字符串的过程中不断调整窗口的大小,以求得最长的无重复字符子串的长度。
3. 编写代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left=0,right=0,len=0;
int n=s.size();
int hash[128]={0};
while(right<n)
{
hash[s[right]]++;
while(hash[s[right]]>1)
{
hash[s[left]]--;//出窗口
left++;
}
len=max(len,right-left+1);//更新结果
right++;
}
if(n==1)
return 1;
return len;
}
};