題目描述:找出其中不含有重複字符的最長子串的長度
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;
}