前言:为什么加强算法?
编程语言千千万,更新迭代更是日新月异,剥除编程语言自身的语言,提炼出来的就是数据结构 + 算法只有把精力放在最基础,最底层的知识上,苦练内功才能以不变应万变,才能提升自己的硬实力。
题目:最长公共前缀,编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
示例1
输入: ["flower","flow","flight"]
输出: "fl"
示例2
输入: ["dog","racecar","car"]
输出: ""
javaScript解题思路
从前往后一次比较字符串,获取公共前缀
时间复杂度:O(s)是所有字符串中字符数量的总和
空间复杂度:O(1)
var longestCommonPrefix = function(strs) {
if (strs === null || strs.length === 0) return "";
let prevs = strs[0]
for(let i = 1; i < strs.length; i++) {
let j = 0
for(; j < prevs.length && j < strs[i].length; j++) {
if(prevs.charAt(j) !== strs[i].charAt(j)) break
}
prevs = prevs.substring(0, j)
if(prevs === "") return ""
}
return prevs
};
typeScript解题思路
1.最长前缀相同,所以要遍历数组中元素最短的一个:x。
2.拿长度最短的元素x判断其它元素是否以它开始,如果都,则返回x,程序结束。
3.如果有一个不是以它开始,则此次判断结束,然后取x的前x.length-1长度,重复2步骤。
3.如果有一个不是以它开始,则此次判断结束,然后取x的前x.length-2长度,重复2步骤。
.......
4.如果取的长度为0,证明没有共同前缀,返回空字符串,程序结束
function longestCommonPrefix(strs: string[]): string {
if (!strs.length) {
return "";
}
let min = strs[0];
strs.forEach(item => {
if (item.length < min.length) {
min = item;
}
});
const minArr = min.split("");
for (let i = minArr.length; i > 0; i--) {
let pre = minArr.slice(0, i).join("");
let has = 0;
for (let j = 0; j < strs.length; j++) {
if (strs[j].startsWith(pre)) {
has++;
} else {
break;
}
}
if (has === strs.length) {
return pre;
}
}
return "";
};