LeetCode解題筆記 - 3. Longest Substring Without Repeating Characters
阿新 • • 發佈:2017-11-18
返回 swe 字符串 opened 比較 obj 是把 character def is a subsequence and not a substring.
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"
給定一個字符串,找到最長的子串的長度沒有重復字符。
這題其實思路就是把字符串中的字符遍歷,記錄每個字符的位置,遇到相同的字符更新位置,然後比較長度。可是自己做的亂七八糟,多出很多沒用的東西。
/** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { var count = 0,//本來想用來記錄當前連續無重復字符數,但其實不需要,i-start+1就等於它 obj = {}, arr= s.split(‘‘), start = 0, length = 0, del = "",//本來想用來記錄,然後刪除重復字符之前的,沒用了的字符,但其實完全沒必要,只需要記錄歷史以前最長長度length和當前無重復字符開始位置start就可以 Substring = "";//審題不仔細,本來以為要返回子字符串的 for(var i=0;i<arr.length;i++){ //debugger; if(obj[arr[i]] === undefined){ }else{ start= obj[arr[i]] + 1; } if(i-start+1 > length){ Substring = s.slice(start,i+1); } obj[arr[i]] = i; } return length; };
然後對比熱門答案,真是無地自容,解題方法沒想到都還算了,本質思路其實不差多少,卻多出來那麽多垃圾代碼。以後要註意審視自己寫的東西了
public int lengthOfLongestSubstring(String s) { if (s.length()==0) return 0; HashMap<Character, Integer> map = new HashMap<Character, Integer>(); int max=0; for (int i=0, j=0; i<s.length(); ++i){ if (map.containsKey(s.charAt(i))){ j = Math.max(j,map.get(s.charAt(i))+1); } map.put(s.charAt(i),i); max = Math.max(max,i-j+1); } return max; }
var lengthOfLongestSubstring = function(s) { var obj = {}, arr = s.split(‘‘), start = 0, length = 0; for (var i = 0; i < arr.length; i++) { if (obj.hasOwnProperty(arr[i])) { start = obj[arr[i]] + 1; } obj[arr[i]] = i; length = Math.max(length, i - start + 1) } return length; };View Code
LeetCode解題筆記 - 3. Longest Substring Without Repeating Characters