「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
解题思路
首先我们需要看清题目,是求最长的公共前缀,而不是最长的公共字符串。
(本人在这里踩了很久的坑,相比求公共字符串,求最长的公共前缀肯定简单多了)
我们可以知道的是result一定是比其中任何一个字符串都要短的。
还有两个需要注意的临界条件:
数组为空的时候,最长公共前缀为空字符串
数组长度为1的时候,最长公共前缀就是strs[0]
方法一
- 先排除无长度的情况
- 先拿第一个和第二个对比,获取最短的那个字符串长度循环
- 字符比较时,发现字符不相等,就可以根据循环比较的次数,更新字符长度。字符为0时,直接退出程序。
- 全部字符都对比过后,拿字符长度直接获取结果
var longestCommonPrefix = function (strs) {
if (!strs.length) return '';
let temp = strs[0];
let len = temp.length;
for (let i = 1; i < strs.length; i++) {
len = len < strs[i].length ? len : strs[i].length;
if (len === 0) return '';
for (let j = 0; j < len; j++) {
if (temp[j] !== strs[i][j]) {
len = j;
break;
}
}
}
return temp.substr(0, len);
};
方法二:数组排序法
- 先排除长度为 0 和 1 的情况。
- 对数组进行排序,sort 用默认排序,或使用 strs.sort((a, b) => a > b? 1: -1) 方法排序。
- 排序好的数组,获取数组头和尾两个数据,获取最短的字符串长度做为遍历次数。
- 遍历获取相同前缀字符串。
var longestCommonPrefix = function (strs) {
if (strs.length === 0) return '';
else if (strs.length === 1) return strs[0];
strs.sort();
let start = strs[0],
end = strs[strs.length - 1],
len = start.length < end.length ? start.length : start.length,
result = '';
for(let i = 0; i < len; i++) {
if (start[i] !== end[i]) break;
result += start[i];
}
return result;
};