5.無重複字符的最長子串

題目描述:找出其中不含有重複字符的最長子串的長度

1.暴力破解

①從第一個字符開始,遍歷到最後一個字符。

②如果有重複的字符出現,記錄此時無重複的長度,跳出第一次的遍歷,從第二個字符開始遍歷,同樣如果有重複字符出現,記錄無重複的長度,循環繼續。。。

③比較所有無重複的長度,選出最長的數值。

//時間複雜度O(n*n),算法最劣
     public int norepeatstr1(String str){
    	 //判斷輸入是否合法
    	 if (str== null || str.length() == 0){
    		 return 0;
    	 }
    	 int max = 0;//記錄無重複子串的最大長度
    	 for(int i = 0; i< str.length(); i++){
    		 HashSet<Character> hashset = new HashSet<Character>();
    		  for (int j = i; j < str.length(); j++){
    			  //如果hashset中含有字符str.charAt(j),則跳出循環,
    			  //重新從下一個字符開始計算最大無重複長度
    			  if(hashset.contains(str.charAt(j))){
    				  break;
    			  }else{
    				  //如果hashset中不含該字符,則繼續添加,並記錄最大長度
    				  hashset.add(str.charAt(j));
    				  max = Math.max(hashset.size(), max);
    			  }
    		  }
    	 }
    	 return max;
    	 
     }

2.滑動窗口

①初始滑動窗口左右邊界[0,0];

②右邊界開始移動,將右邊界經過的字符和下標用map保存下來;

③如果遇到重複字符,獲取重複字符的下標,;(這塊有點問題待解決)

④如果沒有遇到重複字符,更新最大無重複子串長度;

public int norepeatstr2(String str){
    	 //判斷輸入是否合法
    	 if (str== null || str.length() == 0){
    		 return 0;
    	 }
    	 int max = 0;//記錄最大值
    	 int left = 0, right = 0;//滑動窗口的左邊界和右邊界
    	 HashMap<Character, Integer> hashMap = new HashMap<>();
    	 for (; right < str.length(); right++){
    		 if(hashMap.containsKey(str.charAt(right))){
        	    left = Math.max(hashMap.get(str.charAt(right)), left);
    		 }
    		 //map存儲右邊界滑過的字符和該字符的下標+1
    		 hashMap.put(str.charAt(right), right+1);
    		 //更新無重複子串的最大長度
	         max = Math.max(max, right-left+1);
    	 }
    	 return max;
    	 
     }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章