1. 程式人生 > >day4——無重複字元的最長子串

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(牙好痛)