题目描述
题干:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例4:
输入: s = ""
输出: 0
题解思路
找到字符串中的最长的不重复子串,这道题我踩了很多坑,在总结里我在赘述吧,这里我们直接说官方给的滑动窗口法
思路就是我们从第一个元素开始,寻找以它为起始地址的第一个无重复字符的子串,然后依次往后循环重复本步骤
为了对得起自己死去的脑细胞和宝贵的时间,我还是得说一说我自己的思路
我首先想到的是双指针的思路,和官方题解的差别就是在我是通过指针移动,而他是通过删除已经遍历过的节点
所以内存消耗会少很多,但是复杂度还是不能与之匹敌,这里给出我自己的代码供大家批评吧
正确代码
public int lengthOfLongestSubstring1(String s) {
//排除空指针异常的情况
if (s.equals("") || s == null) {
return 0;
}
Set<Character> set = new HashSet<>();
int left = 0,right = 0,ans = 0;
//这个判断条件就显得我的方法很离谱
//逻辑大概就是不相同就继续遍历,相同就重新从下一个开始
while (left < s.length() && right < s.length()){
if (set.add(s.charAt(right))){
right++;
}else {
ans = Math.max(ans,set.size());
set.clear();
left++;
right = left;
}
}
//排除最长子串在最后的情况
return set.size() > ans?set.size():ans;
总结
这道题踩得坑和新的知识很多,这里我们统一总结一下
1. 首先就是字符串的 s.equals("") 和 s == null两个判空方法,后者会出现Index 0 out of bounds for length 0异常
2. 其次是Set set和HashSet set两种定义方法,这其实在另一篇HashMap里说过一次,大同小异,就是为了代码的灵活性
3. 最后就是说一说Set的两个方法,一个清空clear,一个长度size,还有一个查找是否存在的元素contains这三个没用过的方法
其实我现在依然觉得我的逻辑和他相同,为什么时间上相差如此之久,难道每次我都多了前面重复元素的遍历吗?
如果文章存在什么问题或者想帮我解决疑惑,欢迎大牛们在评论区斧正和评论,各自努力,你我最高处见