Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb", the answer is "abc", which the length is 3.
Given "bbbbb", the answer is "b", with the length of 1.
Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
思路:
使用
HashMap
存儲(chǔ)字符及其位置,key
為字符,value
為字符出現(xiàn)的位置;使用
start
記錄子字符串的起始位置;使用
max
記錄符合條件的子字符串的最大長度:max = Math.max(max, index - start + 1)
;遍歷字符串中的每個(gè)字符,用
index
記錄位置,取到每個(gè)字符s.charAt(i)
浴滴,先判斷HashMap
中是否已存在此字符;如果不存在此字符則將其存入
HashMap
:
例如字符串abcda
,HashMap
中依次存入(a, 0)
、(b, 1)
菌羽、(c, 2)
、(d, 3)
.如果存在此相同字符:
1由缆、說明已找到一個(gè)符合條件的子字符串(起始位置為start
注祖,終止位置為index
的上一個(gè)位置);
例如字符串abcdaea
,找到第五個(gè)字符a
為已存在字符均唉,則找到符合條件的子字符串為abcd
;
例如字符串abcddea
是晨,找到第五個(gè)字符d
為已存在字符,則找到符合條件的子字符串為abcd
.
2舔箭、在HashMap
中找到此字符的value
值(也就是位置)罩缴,記為p
,更新子字符串的起始start
位置:如果start >= p + 1
,則仍保留start
位置靴庆,否則更新start = p + 1
;
例如字符串abcddea
时捌,找到相同字符d
,第一次出現(xiàn)位置為3
炉抒,start
值為0
奢讨,則應(yīng)更新start
為4
.
例如字符串abcdaea
,找到相同字符a
焰薄,第一次出現(xiàn)位置為0
拿诸,start
值為0
,則應(yīng)更新start
為1
.
3塞茅、更新此字符在HashMap
中的value
值亩码,即更新它的位置.遍歷結(jié)束后,返回
max
的值.-
實(shí)現(xiàn)代碼
public int lengthOfLongestSubstring(String s) { if (s.length() == 0) { return 0; } HashMap<Character, Integer> map = new HashMap<>(); int max = 0; for (int index = 0, start = 0; index < s.length(); ++ index) { if (map.containsKey(s.charAt(index))) { start = Math.max(start, map.get(s.charAt(index)) + 1); } map.put(s.charAt(index), index); max = Math.max(max, index - start + 1); } return max; }