import java.util.HashMap;
import java.util.Map;
public class lengthOfLongestSubstringWithoutRepeatingCharacters_3 {
/**
*
* @param s
* @return
* 滑動窗口每次向右移動一個單位,移動時將上一次的len與maxLen比較,如果len>maxLen則更新,否則不更新
* 每次將子串放在一個HashMap中
* 每次滑動窗口移動時,需要將i 回退到start-1的位置,因爲i++是在循環體執行完畢才執行的
* 每次循環都需要判斷i是不是最大了,如果是,則沒必要再向後判斷了,因爲不會再有比這個子串長度更長的了。
* 時間複雜度O(mn),空間複雜度O(n)
*/
public static int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
int start = 0; // 當前滑動窗口的起點
int len = 0; // 當前滑動窗口的長度
int maxLen = 0; // 最大子串長度
int maxStart = 0; // 最大子串起點
for(int i = 0; i < s.length(); ++i){
if(map.containsKey(s.charAt(i))){
maxStart = len>maxLen?start:maxStart;
maxLen = len>maxLen?len:maxLen;
++start;
len = 0;
i = start - 1;
map.clear();
}else{
map.put(s.charAt(i), 1);
++len;
}
if(i == s.length() - 1) {
maxLen = len > maxLen ? len : maxLen;
break;
}
}
// System.out.println(s.substring(maxStart, maxStart + maxLen));
return maxLen;
}
public static void main(String[] args){
int result = lengthOfLongestSubstring(" ");
System.out.println(result);
}
}
leetcode Longest Substring Without Repeating Characters 沒有重複字母的最長子串 第三題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.