問題描述:
????給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度添瓷。
示例 1:
????輸入: "abcabcbb"
????輸出: 3
????解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3值纱。
示例 2:
????輸入: "bbbbb"
????輸出: 1
????解釋: 因為無重復字符的最長子串是 "b"鳞贷,所以其長度為 1。
示例 3:
????輸入: "pwwkew"
????輸出: 3
????解釋: 因為無重復字符的最長子串是 "wke"虐唠,所以其長度為 3搀愧。
思路:
????找出不含有重復字符的最長子串,實際就是在字符串中截取子串疆偿,這個子串中沒有重復的字符咱筛。我們可以使用一個HashMap來記錄字符串中的元素和它對應的位置下標,從而可以在遍歷字符串的時候能夠通過map的key值來判斷是否存在重復元素迅箩。然后定義一個子串的起始位置,并開始對字符串進行遍歷处铛。在遍歷的過程中饲趋,如果hashMap的key集合中已經(jīng)包含了正在遍歷的元素撤蟆,說明從重復的key對應的下標到當前元素的下標對應的子串中存在重復元素枫疆,判斷這個子串長度是否是當前最長長度,是的話進行更新圃泡,然后從重復元素對應下標的下一個位置重新開始計算碟案;如果遍歷過程中,hashMap的key集合中一直沒有包含正在遍歷的元素颇蜡,更新子串最大長度价说。
java語言實現(xiàn):
public int lengthOfLongestSubstring(String s) {
????int result = 0;
????if(null == s || s.length() == 0) {
????????return result;
????}
????HashMap map = new HashMap();
????int start = 0;
????for(int i=0; i
????????if(map.containsKey(s.charAt(i))){
????????????start = Math.max(start,map.get(s.charAt(i)) + 1);
????????}
????????map.put(s.charAt(i),i);
????????result = Math.max(result,i - start + 1);
????}
????return result;
}