102 lines
3.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* https://leetcode.cn/problems/longest-common-prefix/?envType=study-plan-v2&envId=top-interview-150
* @param {string[]} strs
* @return {string}
*/
const longestCommonPrefix = function (strs) {
};
/*
如果字符串数组长度为0直接返回"",如果长度不为0则以字符数组中的第一个字符为公共前缀来比较遍历整个字符数组如果当前遍历到的字符
串包含整个公共前缀(第一个字符串),如果不包含,就去掉当前公共前缀的末尾字符,继续比较,如果在比较的过程中发现公共前缀已经变成了
空字符就直接返回
*/
function f1(strs) {
if (strs.length === 0) return '';
let prefix = strs[0]; // 以字符数组中的第一个字符作为公共前缀
for (let i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) !== 0) { // 如果当前字符不包含公共前缀,说明公共前缀长了,要缩短
prefix = prefix.substring(0, prefix.length - 1); // 缩短前缀
if (prefix === '') return ''; // 没有公共前缀直接返回
}
}
return prefix;
}
/*
思路和上面的一致,先比较公共前缀的第一个字符,如果字符串数组的所有字符串都满足就比较公共前缀的第二个字符,如果发现比较的字符串
长度不够,或者当前字符不一致,直接返回公共前缀
*/
function f2(strs) {
if (strs.length === 0) return '';
for (let i = 0; i < strs[0].length; i++) {
const char = strs[0][i]; // 获取第一个字符串的当前字符
for (let j = 1; j < strs.length; j++) {
// 如果当前字符与其他字符串的对应位置字符不一致,返回当前公共前缀
if (i >= strs[j].length || strs[j][i] !== char) {
return strs[0].slice(0, i);
}
}
}
return strs[0]; // 如果循环结束,没有不匹配的,说明整个第一个字符串都是公共前缀
}
function f3(strs) {
if (strs.length === 0) return '';
let prefix = strs[0]; // 以第一个字符串作为初始公共前缀
for (let i = 1; i < strs.length; i++) {
let j = 0;
// 逐个字符比较当前公共前缀和下一个字符串
while (j < prefix.length && j < strs[i].length && prefix[j] === strs[i][j]) {
j++;
}
// 更新公共前缀为当前找到的前缀
prefix = prefix.slice(0, j);
// 如果公共前缀为空,直接返回
if (prefix === '') return '';
}
return prefix; // 返回最终的公共前缀
}
// 二分法代码
// TODO
function f4(strs) {
if (strs.length === 0) return ''; // 如果数组为空,直接返回空字符串
// 定义一个递归函数,用于计算区间 [start, end] 的最长公共前缀
function lcp(start, end) {
if (start === end) {
return strs[start]; // 如果区间只包含一个字符串,直接返回
}
// 计算中点,分成两半
const mid = Math.floor((start + end) / 2);
// 递归计算左右两部分的公共前缀
const lcpLeft = lcp(start, mid);
const lcpRight = lcp(mid + 1, end);
// 计算公共前缀的长度
const minLength = Math.min(lcpLeft.length, lcpRight.length);
// 比较两个公共前缀,找到它们的最长公共前缀
for (let i = 0; i < minLength; i++) {
if (lcpLeft[i] !== lcpRight[i]) {
return lcpLeft.slice(0, i); // 返回公共前缀
}
}
return lcpLeft.slice(0, minLength); // 返回较短的前缀
}
return lcp(0, strs.length - 1); // 对整个字符串数组进行递归处理
}