LeetCode - 014 - 最長公共字首(longest-common-prefix)

jsliang發表於2019-06-04

Create by jsliang on 2019-06-03 10:13:01
Recently revised in 2019-06-03 17:29:09

為方便小夥伴們的檢視,歡迎切換到不同地址~

LeetCode - 014 - 最長公共字首(longest-common-prefix)

一 目錄

不折騰的前端,和鹹魚有什麼區別

目錄
一 目錄
二 前言
三 解題
3.1 解法 - 暴力破解
3.2 解法 - 水平掃描
3.3 解法 - 正規表示式
3.4 解法 - 水平掃描

二 前言

返回目錄

編寫一個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 ""。

示例 1:

輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:

輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共字首。

說明:
所有輸入只包含小寫字母 a-z 。
複製程式碼

三 解題

返回目錄

解題千千萬,官方獨一家,上面是官方使用 Java 進行的題解。

小夥伴可以先自己在本地嘗試解題,再看看官方解題,最後再回來看看 jsliang 講解下使用 JavaScript 的解題思路。

3.1 解法 - 暴力破解

返回目錄

  • 解題程式碼
var longestCommonPrefix = function(strs) {
  if (!strs.length) {
    return '';
  }
  let shortStrLength = strs[0].length; // 最短字串的長度
  let shortStrPosition = 0; // 最短字串的位置
  for (let i = 0; i < strs.length; i++){
    if (strs[i].length < shortStrLength) {
      shortStrLength = strs[i].length;
      shortStrPosition = i;
    }
  }
  let result = [];
  for (let i = 0; i < shortStrLength; i++) {
    for (let j = 0; j < strs.length; j++) {
      if (strs[shortStrPosition][i] != strs[j][i]) {
        return result.join('');
      }
      if (j === strs.length - 1) {
        result[i] = strs[shortStrPosition][i];
      }
    }
  }
  return result.join('');
};
複製程式碼
  • 執行測試 1
  1. strs["flower","flow","flight"]
  2. return
"fl"
複製程式碼
  • 執行測試 2
  1. strs["dog","racecar","car"]
  2. return
""
複製程式碼
  • LeetCode Submit
✔ Accepted
  ✔ 118/118 cases passed (92 ms)
  ✔ Your runtime beats 86.97 % of javascript submissions
  ✔ Your memory usage beats 36.33 % of javascript submissions (35.1 MB)
複製程式碼
  • 知識點
  1. join()join() 方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。join() 詳細介紹
  • 解題思路

LeetCode - 014 - 最長公共字首(longest-common-prefix)

首先,我們進行非空判斷,當它是 [''] 這樣子時,我們直接返回 ''

然後,我們進行第一次遍歷,我們需要獲取到最短字串,因為這樣我們就可以進行最短的 for 遍歷;我們順帶儲存下位置,方便獲取這個字串。

接著,我們進行雙重遍歷(第二/第三次遍歷),將最短字串的每個字元和其他字串進行比對,正常情況下,我們找到不相同後,就返回結果。

最後,如果我們第二/第三次遍歷沒有做到執行,我們返回空字串即可。

3.2 解法 - 水平掃描

返回目錄

  • 解題程式碼
var longestCommonPrefix = function(strs) {
  if (strs.length < 2) {
    return !strs.length ? '' : strs[0];
  }
  
  var result = strs[0];
  
  for(let i = 0; i < result.length; i++) {
    for(let j = 1; j < strs.length; j++) {
      if (result[i] !== strs[j][i]) {
        return result.substring(0, i);
      }
    }
  }
  return result;
};
複製程式碼
  • 執行測試 1
  1. strs["flower","flow","flight"]
  2. return
"fl"
複製程式碼
  • 執行測試 2
  1. strs["dog","racecar","car"]
  2. return
""
複製程式碼
  • LeetCode Submit
✔ Accepted
  ✔ 118/118 cases passed (88 ms)
  ✔ Your runtime beats 91.9 % of javascript submissions
  ✔ Your memory usage beats 46.38 % of javascript submissions (34.9 MB)
複製程式碼
  • 知識點
  1. substring()substring() 方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。substring() 詳細介紹
  • 解題思路

LeetCode - 014 - 最長公共字首(longest-common-prefix)

該思路和 3.1 解法相似,理解了上面,看這幅圖就是 OK 的了。

3.3 解法 - 正規表示式

返回目錄

  • 解題程式碼
var longestCommonPrefix = function(strs) {
  if (strs.length < 2) {
    return !strs.length ? '' : strs[0];
  }
  
  let base = strs.shift(),
    joinStrs = '@' + strs.join('@'),
    regx = '@',
    res = '';

  for(let i = 0; i < base.length; i++){
    regx += base.substring(i, i + 1);
    let matchArr = joinStrs.match(new RegExp(`${regx}`,"g")) || [];
    if(matchArr.length === strs.length){
      res += base.substring(i, i+1);
    }
  }
  return res;
};
複製程式碼
  • 執行測試 1
  1. strs["flower","flow","flight"]
  2. return
"fl"
複製程式碼
  • 執行測試 2
  1. strs["dog","racecar","car"]
  2. return
""
複製程式碼
  • LeetCode Submit
✔ Accepted
  ✔ 118/118 cases passed (108 ms)
  ✔ Your runtime beats 45.03 % of javascript submissions
  ✔ Your memory usage beats 16.23 % of javascript submissions (35.9 MB)
複製程式碼
  • 知識點
  1. join()join() 方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。join() 詳細介紹
  2. substring()substring() 方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。substring() 詳細介紹
  3. RegExp:建構函式的原型物件。常用語一些便捷操作。RegExp 詳細介紹
  • 解題思路

LeetCode - 014 - 最長公共字首(longest-common-prefix)

首先,我們跟前兩種方法一樣進行空陣列和陣列長度為 1 時的判斷。

然後,我們將陣列第一個字串通過 shift() 的形式給裁剪出來。

接著,我們將陣列以 @ 的形式拼接成字串。因為下面我們將通過 @ 的形式來判斷程式碼是否符合正則校驗。

再然後,通過 for 迴圈和正規表示式判斷,如果成立了,下次再判斷的時候,就通過字串拼接的形式,擴充校驗規則欄位 regx

最後,如果匹配返回的長度和陣列總長度相等的情況下,我們就通過字串拼接的形式修改返回值。

3.4 解法 - 水平掃描

返回目錄

  • 解題程式碼
var longestCommonPrefix = function(strs) {
  if (strs.length < 2) {
    return !strs.length ? '' : strs[0];
  }
  
  return strs.reduce((prev, next) => {
    let i = 0;
    while (prev[i] && next[i] && prev[i] === next[i]) {
      i++;
    };
    return prev.slice(0, i);
  });
};
複製程式碼
  • 執行測試 1
  1. strs["flower","flow","flight"]
  2. return
"fl"
複製程式碼
  • 執行測試 2
  1. strs["dog","racecar","car"]
  2. return
""
複製程式碼
  • LeetCode Submit
✔ Accepted
  ✔ 118/118 cases passed (80 ms)
  ✔ Your runtime beats 96.32 % of javascript submissions
  ✔ Your memory usage beats 21.06 % of javascript submissions (35.5 MB)
複製程式碼
  • 知識點
  1. reduce()reduce() 方法對陣列中的每個元素執行一個由您提供的reducer函式(升序執行),將其結果彙總為單個返回值。reduce() 詳細介紹
  2. slice()slice() 方法提取一個字串的一部分,並返回一新的字串。slice() 詳細介紹
  • 解題思路

LeetCode - 014 - 最長公共字首(longest-common-prefix)

首先,這無疑是這四種思路中,寫法看起來最簡潔的。

然後,通過 reduce(),我們可以進行一項累加操作:先比較第一項和第二項,然後找到它們共通值後,剪下並 return;再比較的時候,使用 return 出來的值和第三項進行比較……依次類推

最後,返回最後一次 return 的值。


jsliang 廣告推送:
也許小夥伴想了解下雲伺服器
或者小夥伴想買一臺雲伺服器
或者小夥伴需要續費雲伺服器
歡迎點選 雲伺服器推廣 檢視!

LeetCode - 014 - 最長公共字首(longest-common-prefix)
LeetCode - 014 - 最長公共字首(longest-common-prefix)

知識共享許可協議
jsliang 的文件庫樑峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於github.com/LiangJunron…上的作品創作。
本許可協議授權之外的使用許可權可以從 creativecommons.org/licenses/by… 處獲得。

相關文章