题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
输入输出样例
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
题解
先上代码,本题采用C++语言编写,涉及的内容主要有:unordered_set(hash集合),多循环判断。
int lengthOfLongestSubstring(string s) {
int i = 0,j = 0,temp=0;
//循环所需变量以及求最大值时所需的temp交换变量
while(i!=s.size()){
unordered_set<char> occ;
//设置s.size次循环,在每个循环中定义一次hash集合
int num = 0;
//num变量用于记录子串长度
for(j=i;j<s.size();++j){
if(occ.count(s[j])>0){
break;
}
//判断hash集合中的该元素个数,大于零意味着重复,跳出循环
occ.insert(s[j]);
//将元素添加到hash集合中
num++;
}
i++;
if(num>temp){
temp=num;
}
//判断与交换变量大小来求最大值
}
return temp;
}
分析
主要思路:主体两次循环。第一个循环是num的次数,num的次数应为子串的可能出现的长度,例如s="abcd",子串可能的长度为1、2、3、4,故num为4;第二个循环是遍历字符串,并将元素添加到hash集合中。
时间复杂度:O()
总结
本人是编程小白,还未系统的学习过算法,代码还有很大改进的空间,欢迎大家批评与建议,但是我觉得对于像我一样的编程小白来说,还是很通俗易懂的,希望能有所帮助!