这题做的我有点那个 可能是跟今日心情有点关系~~
题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
输入:strs = ["flower","flow","flight"]
输出:"fl"
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
能做来即可的解法:
我都不知道这题考啥
感觉就是比对
我的思路是先找出最短的然后根据最短的去比对数组里的值的每一项
感觉我写的贼麻烦
/*
* @lc app=leetcode.cn id=14 lang=javascript
*
* [14] 最长公共前缀
*/
// @lc code=start
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
let len = strs.length;
if (len <= 1) return strs.toString();
let temp = strs[0];
let res = "";
for (let i = 0; i < len; i++) {
if (temp.length > strs[i].length) {
temp = strs[i];
}
}
for (let j = 0; j < temp.length; j++) {
let flag = true;
for (let item = 0; item < len; item++) {
if (strs[item].includes(temp[j]) && strs[item][j] == temp[j]) {
flag = true;
} else {
flag = false;
break;
}
}
if (flag) {
res += temp[j];
} else {
break;
}
}
return res;
};
// @lc code=end
123/123 cases passed (72 ms)
Your runtime beats 83.31 % of javascript submissions
Your memory usage beats 36.09 % of javascript submissions (39.7 MB)
好的解题答案:
1.逐一比对,找出公共的
/*
* @lc app=leetcode.cn id=14 lang=javascript
*
* [14] 最长公共前缀
*/
// @lc code=start
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
if (strs.length == 0) return "";
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.charAt(j) !== strs[i].charAt(j)) break;
}
ans = ans.substring(0, j);
if (ans === "") return "";
}
return ans;
};
// @lc code=end
2.仅比对最长和最短的字符串
/*
* @lc app=leetcode.cn id=14 lang=javascript
*
* [14] 最长公共前缀
*/
// @lc code=start
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
//最大最小长度比对
if (strs.length <= 1) return strs.toString();
let min = 0,
max = 0;
for (let i = 1; i < strs.length; i++) {
if (strs[min] > strs[i]) {
min = i;
}
if (strs[max] < strs[i]) {
max = i;
}
}
for (let index = 0; index < strs[min].length; index++) {
if (strs[min].charAt(index) != strs[max].charAt(index)) {
return strs[min].substring(0, index);
}
}
return strs[min];
};
// @lc code=end
3、分治策略
/*
* @lc app=leetcode.cn id=14 lang=javascript
*
* [14] 最长公共前缀
*/
// @lc code=start
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
if (strs === null || strs.length === 0) return "";
return lCPrefixRec(strs);
};
// 若分裂后的两个数组长度不为 1,则继续分裂
// 直到分裂后的数组长度都为 1,
// 然后比较获取最长公共前缀
function lCPrefixRec(arr) {
let length = arr.length;
if (length === 1) {
return arr[0];
}
let mid = Math.floor(length / 2),
left = arr.slice(0, mid),
right = arr.slice(mid, length);
console.log("left", left, "right", right);
return lCPrefixTwo(lCPrefixRec(left), lCPrefixRec(right));
}
// 求 str1 与 str2 的最长公共前缀
function lCPrefixTwo(str1, str2) {
console.log("str1", str1, "str2", str2);
let j = 0;
for (; j < str1.length && j < str2.length; j++) {
if (str1.charAt(j) !== str2.charAt(j)) {
break;
}
}
return str1.substring(0, j);
}
// @lc code=end
感觉第三种更好理解一点,平时也总是用,就是把问题进行拆分;大问题变成小问题;