目描述: 給定一個字符串,請你找出其中不含有重復(fù)字符的 最長子串 的長度。 示例 1: 輸入: "abcabcbb" 輸出: 3 解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “abc”,所以其長度為 3。 示例 2: 輸入: "bbbbb" 輸出: 1 解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “b”,所以其長度為 1。 示例 3: 輸入: "pwwkew" 輸出: 3 解釋: 因?yàn)闊o重復(fù)字符的最長子串是 “wke”,所以其長度為 3。 請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。 解題思路 看到這題之后的第一想法就是循環(huán),然后利用HashMap去記錄每次收集的無重復(fù)字符,然后再定義個record去記錄收集開始時的下標(biāo),下標(biāo)更新的判斷就是當(dāng)前HashMap是否有遍歷到的字符,不過后面一想,既然是判斷,其實(shí)沒必要另外申請空間,因?yàn)槲矣衦ecord記錄的下標(biāo),所以我只需要對原字符進(jìn)行判斷就好,恰好JS的indexOf跟PY的index是一樣的,可以選擇查詢開始的位置,所以就將HashMap去掉,直接查詢原數(shù)組,這樣確實(shí)比較沒那么占空間。 JS版 /** * @param {string} s * @return {number} */ const lengthOfLongestSubstring = s => { let len = s.length if (len <= 1) { return len } let max = 1 let record = 0 for (let i = 0; i < len; ++i) { let index = s.indexOf(s[i], record) if (index < i) { record = index + 1 } max = Math.max(max, i - record + 1) } return max }
TS版 /** * @param {string} s * @return {number} */ const lengthOfLongestSubstring = (s: string): number => { let len: number = s.length if (len <= 1) { return len } let max: number = 1 let record: number = 0 for (let i: number = 0; i < len; ++i) { let index: number = s.indexOf(s[i], record) if (index < i) { record = index + 1 } max = Math.max(max, i - record + 1) } return max }
PY版 class Solution: def lengthOfLongestSubstring(self, s: str) -> int: """ :type s: str :rtype: int """ if len(s) <=1: return len(s) maxLen = 1 record = 0 for i in range(len(s)): index = s.index(s[i], record) if index < i: record = index + 1 maxLen = max(maxLen, i - record + 1) return maxLen
|