离开力扣两三天,手就痒痒啊!完了,彻底中毒了,哈哈哈!!!
首先肯定想到的是暴力解法,双指针,里外循环一起走,但是这个时间复杂度为O(n2),为了减少时间复杂度,我们让内循环(左指针)不回头的遍历,拿到一个ans的字符子串长度,丢弃左指针的字符,右指针判断下一个位置的字符是否与现在的字符子串内的字符重复,不重复就加进来,重复就不加,左指针继续向右走。直到越界。
class Solution { public int lengthOfLongestSubstring(String s) { //储存不重复的字符 Set<Character> hashset = new HashSet<>(); //将右指针至于左边界的左端 int right = -1; int ans = 0; //遍历左指针,记录最长字符子串。扔掉最左边的一个字符,右指针往右走看看是否比上一组字符子串长,长就记录下来 for(int left = 0; left < s.length(); left++) { if(left != 0) { hashset.remove(s.charAt(left - 1)); } while(right+1 < s.length() && !hashset.contains(s.charAt(right + 1))) { hashset.add(s.charAt(right + 1)); right++; } ans = Math.max(ans, right - left + 1); } return ans; } }
完蛋,晚上遇到一个题,看了别人题解没想明白,哈哈哈,现在脑袋都大了,明天再看看吧,呜呜呜!!!