给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
提示:
0 <= s.length <= 5 *s由英文字母、数字、符号和空格组成
关键词:双指针,哈希表
思路:设置两个指针i和j,i遍历字符串中的每个字符,j记录从i开始向左能够达到的最远处(满足不重复子串的要求)。另开辟一个哈希数组map,其下标代表ASCII码值,值代表该字符在区间[j, i]上出现的次数。i每次指向一个新的字符时,首先将s[i]代表的字符加入区间(即map[s[i]]++),之后检查map[s[i]]是否大于1,如果是,将j右移,直到map[s[i]] == 1。
题解如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int map[130] = {0}; // 下标为对应字符的ASCII码值,内容为当前区间内字符的出现次数
int n = s.length();
int res = 0;
for(int i = 0, j = 0; i < n; i++)
{
map[s[i]]++;
while(map[s[i]] > 1)
{
// 区间内存在重复字符,将j(左边界)的字符移出区间,j后移
map[s[j]]--;
j++;
}
res = max(res, i - j + 1);
}
return res;
}
};
&spm=1001.2101.3001.5002&articleId=146351658&d=1&t=3&u=9441714856af452cbfd5e0e9d2870d70)
1920

被折叠的 条评论
为什么被折叠?



