给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
整体思路:两个for循环嵌套,第一个 for 用于循环读取字符,每读取一个字符 s[i] ,我们就从第一个不重复的字符位置 start 开始遍历到当前字符的前一个位置 i-1 ,判断这个区间中是否有与 s[i] 重复的,如果有,则更新最长子串ans, start ,并break跳出循环,由于start位置更新 ans也得更新,两层循环结束,直接输出ans
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int ans = 0;//答案
int start = 0;//对比元素开始下标
for (int i = 0; i < s.size(); ++i) {//遍历字符串
for (int j = start; j < i; ++j) {//遍历字符串与之对比
if (s[j] == s[i]) {//如果遍历到相同字符
ans = max(ans, i - start);//更新答案
start = j + 1;//将对比开始位置移到当前重复的下一个位置
break;//找到重的就退出本层循环
}
}
ans = max(ans, i - start + 1);//更新ans。1.因为从一开始自身就算一个长度
//2.start更新ans对应也需要更新
}
return ans;
}
};

1057

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



