「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
每日刷题第32天 2021.1.28
14. 最长公共前缀
- leetcode原题链接:leetcode-cn.com/problems/lo…
- 难度:简单
- 方法:
slice(start, end)、substr(start, len)
题目
- 编写一个函数来查找字符串数组中的最长公共前缀。
- 如果不存在公共前缀,返回空字符串
""。
示例
- 示例1
输入: strs = ["flower","flow","flight"]
输出: "fl"
- 示例2
输入: strs = ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
提示
1 <= strs.length <= 2000 <= strs[i].length <= 200strs[i]仅由小写英文字母组成
解法
解法1(自己的想法)
- 首先‼️:判断临界条件,输入的数组长度为1时,直接返回:数组中存储的字符串即可。
- 第一步:找出所给的字符串中,最短的字符串,将其作为“比较对象”。(例如示例1中,'flow'字符串即为“比较对象”)
- 第二步:将其他的字符串 与 最短字符串的每个截取部分进行比较。
- 如果有不同就跳出,直接输出:最长的公共前缀(相同时,记录相同的子字符串)
- 如果一直遍历到最后都没有找到不同,那么就输出 “比较对象”(最短的字符串)
- 模拟本题(如下图所示)
后来思考🤔
- 发现使用这种做法,其实不需要使用
slice()方法也可以实现,就是单独的将“比较对象”的每一项 与 其他字符串的每一项进行比较,遇到不同直接输出。 - 拓展:
slice(start, end)方法,截取字符串数组的[start, end)区间中的值。substr(start, len)方法,截取字符串数组的开始位置 到 长度为len的值。
代码展示
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
// 有一个不相同就直接返回
if(strs.length == 1) return strs[0];
// 取最短的字符串
let lenRow = Infinity;
let index = 0;
for(let i = 0; i < strs.length; i++) {
if (strs[i].length < lenRow){
lenRow = Math.min(lenRow, strs[i].length);
index = i;
}
}
// console.log('lenRow',lenRow,'index',index);
// 截取 当前需要比较的字符串 所有的字符串
let longest = "";
for(let i = 0; i < strs[index].length; i++){
let a = strs[index].slice(0,i + 1);
for (let j = 0; j < strs.length; j++) {
if (j == index) continue;
// console.log('截取',strs[index].slice(0,i + 1));
let b = strs[j].slice(0, i + 1);
// console.log('a',a,'b',b);
if(!(a == b)) return longest;
}
longest = a;
}
return strs[index];
};
解法2(查看题解后的思路优化)
- 取字符串数组的第一个字符串,作为“比较对象”
- 与下一个字符串比较的时候,找到公共的前缀(每次通过字符串的
substr()方法来实现截取)。 - 以此循环往下,找到所有字符串的公共前缀即:最长的公共前缀
- 如果还没有找完,公共前缀为空,就返回空字符串
- 如果找到最后都没有为空,那么返回最长的公共前缀即可
- 代码展示
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
let ans = strs[0];
for(let i = 1;i < strs.length; i++) {
let j = 0;
for(;j < ans.length && j < strs[i].length; j++) {
if(ans[j] != strs[i][j])
break;
}
ans = ans.substr(0, j);
if(ans === "")
return ans;
}
return ans;
};