题目:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
初学算法, 没什么思路。 在网络上搜索到四种解题思路,打算一一尝试。
思路来源:https://www.aliyun.com/jiaocheng/17602.html
方法一:横向遍历。 以第一个string为标准,依次判断是否是前缀,如果不是就减一,直到为前缀。
我的代码:
var longestCommonPrefix = function( strs ) {
var maxNum = strs.length - 1; // 数组长度
if (maxNum < 0) return ""; // -1 取反为 true
else if (maxNum === 0) return strs[maxNum];
else{
var temp = strs[0]; // 记录第一个字符串为LCP(公共前缀)
var num = 1; // 记录比较位置
while(temp){
if (temp === strs[num] ) {
temp = strs[num];
}else if( temp !== strs[num] ) {
var len = temp.length > strs[num].length ? temp.length : strs[num].length;
for (var i = 0 ; i < len ; i++) {
if (temp.charAt(i) !== strs[num].charAt(i)) {
temp = temp.substr(0, i);
break;
}
}
}
if (num === maxNum) break; //判断是否到最后一个
else {
num++;
}
}
}
return temp;
};
刚写完自己还比较开心, 但发现我的执行时间为100ms+时, 和leetcode上别人的时间比多了不是一点半点。 尝试完其余方法后, 就去leetcode上研究别人的思路了。
方法二:纵向遍历。 从第一个字符开始遍历,知道找到所有字符串出现不一样的字符为止
我的代码:
var longestCommonPrefix = function (strs) {
var maxLen = strs.length;
if (maxLen === 0) return "";
if (maxLen === 1) return strs[0];
var temp = ""; // 存放LCP
var num = null; // 记录位置
var str = strs[0];
for (var i = 0; i < str.length; i++) {
for (var j = 0 ; j < maxLen - 1; j++) {
if (strs[j][i] !== strs[j+1][i]) {
return temp;
}
num = i + 1;
}
temp = str.substr(0, num);
}
return temp;
};
这次比上次快了30ms, 看来选择不同方法速度就会有明显改善。 算法真好玩。