// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误,
或有其他见解,往不吝赐教,感激不尽,拜谢。
领扣 第2题 今日算法
题干
//给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
//
// 示例 1:
//
// 输入: "abcabcbb"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
// 示例 2:
//
// 输入: "bbbbb"
// 输出: 1
// 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
// 示例 3:
//
// 输入: "pwwkew"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
// 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
/*
*初次解题,仍是使用的暴力解法
*受昨天影响,采用hashmap作为容器
*当容器中包含该元素时,
* 则从该元素之后重新填入元素,
* 同组数据540ms 仅超越了0.98%
* 暴力方法实在是有点蠢
* */
1 public static int lengthOfLongestSubstring(String s) { 2 if(s.length()<=1){ 3 return s.length(); 4 } 5 HashMap<Character,Integer> map =new HashMap<>(s.length()); 6 char[] chs = s.toCharArray(); 7 char c; 8 int maxlength=0; 9 for(int a=0;a<chs.length;a++){ 10 c=chs[a]; 11 if(!map.containsKey(c)){ 12 map.put(c,a); 13 if(a==chs.length-1){ 14 int size = map.size(); 15 if(maxlength<size){ 16 maxlength=size; 17 } 18 } 19 }else{ 20 a=map.get(c); 21 int size = map.size(); 22 if(maxlength<size){ 23 maxlength=size; 24 } 25 map.clear(); 26 } 27 28 } 29 return maxlength; 30 }
/*
* 愚蠢的我只记得了昨天的hashmap,
* 当点开了前列的一个答案时
* 才特么的想起了hashset
* 顺便学习到了 滑窗思想
* 设立了窗户的边界 i,j
* 当窗户中包含了某一元素时,则不停的收缩左窗边(i--)
* 相当精彩 牙很痛 是在写不下了
* 先这样吧 明天再细分析和写注释
* */
1 public int lengthOfLongestSubstring(String s) { 2 int n = s.length(); 3 Set<Character> set=new HashSet<>(); 4 int ans=0,i=0,j=0; 5 while(i<n&&j<n){ 6 if(!set.contains(s.charAt(j))){ 7 set.add(s.charAt(j++)); 8 ans=Math.max(ans,j-i); 9 } 10 else{ 11 set.remove(s.charAt(i++)); 12 //滑动窗口思想类似于队列,若当前字符包含在窗口中,则窗口左侧收紧,一直到该元素出去窗口。 13 } 14 } 15 return ans; 16 }
Experience is the name every one gives to their mistakes.
每个人犯了错误,都自称是经验
写于 2018.11.19(牙好痛)