不少前端工程師甚至不少研發工程師都缺少數據結構和算知識,前端算法精選系列是一個針對常見的、高頻的算法題作的一個算法解析系列,文章會給出詳細的思路和解答,但願能夠幫助到你。前端
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。算法
示例1:數組
輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3
示例2:微信
輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。
示例3:前端工程師
輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
先看一下這道題的要求,它要求返回一個字符串中無重複字符的最大子串長度,時間複雜度和空間複雜度要求儘量的低,有如下的思路數據結構
既然是最大子串的長度,首先最明顯的思路就是維護一個最大不重複子串的變量和最大長度的變量。好比對於 「abcabcbb」 來講,維護一個cur來存當前最大不重複子串、max維護最大長度,那麼就有如下過程:函數
代碼以下:spa
/** * @param {string} s * @return {number} */ var lengthOfLongestSubstring = function(s) { if(s.length === 0 || s.length === 1) return s.length; let cur = '', max = ''; for(let i = 0;i < s.length;i++) { const index = cur.indexOf(s[i]); if(index >= 0) { cur = cur.slice(index+1); } cur += s[i]; if(cur.length >= max.length) max = cur; } return max.length; };
編寫一個函數來查找字符串數組中的最長公共前綴,若是不存在公共前綴,返回空字符串。code
示例1:rem
輸入: ["flower","flow","flight"]
輸出: "fl"
示例2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
這道題求一組字符串的最長公共前綴,思路能夠轉化成先以第一個字符串爲最長公共前綴,而後跟第2個字符串對比,截取公共前綴部分,再跟第3個字符串對比,截取公共部分...依次進行下去,若是途中遇到公共前綴部分爲空,則說明不存在公共前綴,函數返回空字符串。代碼以下:
/** * @param {string[]} strs * @return {string} */ var longestCommonPrefix = function(strs) { if(strs.length === 0) return ""; let prefix = strs[0]; for(let i = 1;i < strs.length;i++) { let cur = strs[i]; let index = 0; if(prefix === '') break; while(index < prefix.length && index < cur.length) { if(prefix[index] !== cur[index]) break; index++; } prefix = prefix.slice(0, index); console.log(prefix); } return prefix; };
歡迎關注前端亞古獸微信公衆號,持續乾貨輸出