Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说leetcode学习笔记:《数组和字符串》——最长公共前缀[亲测有效],希望能够帮助你!!!。
https://leetcode.cn/problems/longest-common-prefix
重点:最长公共前缀
所以思路很直白,通过遍历,确定最长的前缀。
function longestCommonPrefix(strs: string[]): string {
let prefix = ''
// 比较关键的一步,将字符串数组按照长度由短到长排列,减少比较时间
strs.sort((a, b) => a.length - b.length)
// 按照最短字符串的长度开始遍历比较
for (let i = 0, l = strs[0].length; i < l; i++) {
let flag = true
for (let j = 1, l2 = strs.length; j < l2; j++) {
// 不匹配的情况下快速返回
if (strs[j][i] !== strs[j - 1][i]) {
flag = false
break;
}
}
// 匹配的话要更新最长前缀的值
if (flag) {
prefix += strs[0][i]
} else {
// 不匹配快速跳出
break;
}
}
return prefix
}
提交结果:
这种方式对内存的使用不太友好,可以看下下面这种内存使用更优的方案:
function longestCommonPrefix(strs: string[]): string {
let prefix = strs[0]; // 假设第一个单词是公共前缀
for (let i = 1; i < strs.length; i++) {
while (!strs[i].startsWith(prefix)) {
prefix = prefix.slice(0, -1); // 从当前前缀的末尾去掉一个字符
}
}
return prefix; // 返回最长的公共前缀
};
1. `let prefix = strs[0];`:假设第一个单词是公共前缀,将其作为初始前缀。
2. `for (let i = 1; i < strs.length; i++)`:遍历除第一个单词以外的所有单词。
3. `while (!strs[i].startsWith(prefix))`:如果当前单词不以当前前缀开头,则执行循环。即,只要当前前缀不是当前单词的前缀,就继续循环。
4. `prefix = prefix.slice(0, -1);`:从当前前缀的末尾去掉一个字符,缩短前缀的长度。
5. `return prefix;`:返回最长的公共前缀。