【第1期】前端算法精選-字符串系列

不少前端工程師甚至不少研發工程師都缺少數據結構和算知識,前端算法精選系列是一個針對常見的、高頻的算法題作的一個算法解析系列,文章會給出詳細的思路和解答,但願能夠幫助到你。前端

無重複字符的最長子串

題目

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。算法

示例1:數組

輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3

示例2:微信

輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。

示例3:前端工程師

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

解法

先看一下這道題的要求,它要求返回一個字符串中無重複字符的最大子串長度,時間複雜度和空間複雜度要求儘量的低,有如下的思路數據結構

既然是最大子串的長度,首先最明顯的思路就是維護一個最大不重複子串的變量和最大長度的變量。好比對於 「abcabcbb」 來講,維護一個cur來存當前最大不重複子串、max維護最大長度,那麼就有如下過程:函數

  1. 遍歷到a,此時cur='',不包含'a',因此cur=cur+'a'='a';cur長度爲1大於max的初始值0,因此更新max=1;
  2. 遍歷到b,此時cur='a',不包含'b',因此cur=cur+'b'='ab';cur長度爲2大於max,因此更新max=2;
  3. 遍歷到c,此時cur='ab',不包含'c',因此cur=cur+'c'='abc',cur長度爲3大於max,因此更新max=3;
  4. 遍歷到a,此時cur='abc',包含'a',因此截掉'a'以及它以前的字符串獲得cur='bc',而後再加上這一輪的'a',獲得cur='bca';cur長度爲3不大於max,因此不更新max
  5. 按照以上的邏輯繼續遍歷...

代碼以下: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;
};

歡迎關注前端亞古獸微信公衆號,持續乾貨輸出

相關文章
相關標籤/搜索