day4——无重复字符的最长子串

// 小白一名,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(牙好痛)

猜你喜欢

转载自www.cnblogs.com/zqmjava/p/9986517.html
今日推荐