Create by jsliang on 2019-06-03 10:13:01
Recently revised in 2019-06-03 17:29:09
為方便小夥伴們的檢視,歡迎切換到不同地址~
一 目錄
不折騰的前端,和鹹魚有什麼區別
目錄 |
---|
一 目錄 |
二 前言 |
三 解題 |
3.1 解法 - 暴力破解 |
3.2 解法 - 水平掃描 |
3.3 解法 - 正規表示式 |
3.4 解法 - 水平掃描 |
二 前言
- 難度:簡單
- 涉及知識:字串
- 題目地址:leetcode-cn.com/problems/lo…
- 題目內容:
編寫一個函式來查詢字串陣列中的最長公共字首。
如果不存在公共字首,返回空字串 ""。
示例 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:
strs
:["flower","flow","flight"]
return
:
"fl"
複製程式碼
- 執行測試 2:
strs
:["dog","racecar","car"]
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)
複製程式碼
- 知識點:
join()
:join()
方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。join()
詳細介紹
- 解題思路:
首先,我們進行非空判斷,當它是 ['']
這樣子時,我們直接返回 ''
。
然後,我們進行第一次遍歷,我們需要獲取到最短字串,因為這樣我們就可以進行最短的 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:
strs
:["flower","flow","flight"]
return
:
"fl"
複製程式碼
- 執行測試 2:
strs
:["dog","racecar","car"]
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)
複製程式碼
- 知識點:
substring()
:substring()
方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。substring()
詳細介紹
- 解題思路:
該思路和 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:
strs
:["flower","flow","flight"]
return
:
"fl"
複製程式碼
- 執行測試 2:
strs
:["dog","racecar","car"]
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)
複製程式碼
- 知識點:
join()
:join()
方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。join()
詳細介紹substring()
:substring()
方法將一個陣列(或一個類陣列物件)的所有元素連線成一個字串並返回這個字串。substring()
詳細介紹RegExp
:建構函式的原型物件。常用語一些便捷操作。RegExp
詳細介紹
- 解題思路:
首先,我們跟前兩種方法一樣進行空陣列和陣列長度為 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:
strs
:["flower","flow","flight"]
return
:
"fl"
複製程式碼
- 執行測試 2:
strs
:["dog","racecar","car"]
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)
複製程式碼
- 知識點:
reduce()
:reduce()
方法對陣列中的每個元素執行一個由您提供的reducer函式(升序執行),將其結果彙總為單個返回值。reduce()
詳細介紹slice()
:slice()
方法提取一個字串的一部分,並返回一新的字串。slice()
詳細介紹
- 解題思路:
首先,這無疑是這四種思路中,寫法看起來最簡潔的。
然後,通過 reduce()
,我們可以進行一項累加操作:先比較第一項和第二項,然後找到它們共通值後,剪下並 return
;再比較的時候,使用 return
出來的值和第三項進行比較……依次類推
最後,返回最後一次 return
的值。
jsliang 廣告推送:
也許小夥伴想了解下雲伺服器
或者小夥伴想買一臺雲伺服器
或者小夥伴需要續費雲伺服器
歡迎點選 雲伺服器推廣 檢視!
jsliang 的文件庫 由 樑峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議進行許可。
基於github.com/LiangJunron…上的作品創作。
本許可協議授權之外的使用許可權可以從 creativecommons.org/licenses/by… 處獲得。