难度中等
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
本人通过代码如下(附带注释):
#include<iostream>
#include<string>
using namespace std;
int lengthOfLongestSubstring(string s) {
string s1; // 定义一个字符串变量 s1,表示当前最长无重复子串
int len,len1,flag,cnt=1,max=1; // 定义一些变量,其中 max 表示最长无重复子串长度
len=s.length(); // 获取字符串 s 的长度
if(len==0) return 0; // 特判:如果字符串为空,则最长无重复子串长度为 0
s1+=s[0]; // 将第一个字符添加到 s1 中,作为当前最长无重复子串
for(int i=1;i<len;i++){ // 遍历字符串 s 中的每个字符
len1=s1.length(); // 获取当前 s1 字符串的长度
flag=1; // 标记变量,表示是否有重复字符
for(int j=0;j<len1;j++){ // 在 s1 中查找当前字符是否有重复
if(s[i]==s1[j]){ // 如果有重复字符
// 将 s1 更新为从 s1[j+1] 到 s[i-1] 的子串,再加上当前字符 s[i]
s1=s1.substr(j+1,i-(j+1));
s1+=s[i];
flag=0; // 设置 flag 为 0,表示有重复字符
break; // 跳出循环
}
}
if(flag==1){ // 如果没有重复字符
s1+=s[i]; // 直接将当前字符加入 s1
}
if(s1.length()>max) max=s1.length(); // 更新最长无重复子串长度
}
if(s1.length()>max) max=s1.length(); // 特判:最后一次更新的 s1 可能是最长无重复子串
return max; // 返回最长无重复子串长度
}
int main(){
string s;
cin>>s; // 输入字符串
cout<<lengthOfLongestSubstring(s); // 输出最长无重复子串长度
return 0;
}