编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。示例 1:
输入: ["flower","flow","flight"] 输出: "fl"示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。说明:
所有输入只包含小写字母
a-z
。
思路:
对输入的数组用sort()根据字符串长度排序,因为是求公共的最长前缀,所以其长度必定小于等于数组[0].length,只需将数组的首位字符串和之后字符串逐位对比即可,存取到截止的索引号,切片出来返回。
代码:
/**
1. @param {string[]} strs
2. @return {string}
*/
var longestCommonPrefix = function(strs) {
if(strs==null||strs.length<1){
return "";
}
function sortByAsc(a,b){
var alen=a.length,
blen=b.length;
return alen-blen;
}
strs.sort(sortByAsc);
var len=strs[0].length,
len2=strs.length,
arr=[];
for(var i=1;i<len2;i++){
for(var j=0;j<len;j++){
if(strs[0][j]!==strs[i][j]){
arr.push(j);
break;
}
}
}
if(arr.length>1){
arr.sort(function(a,b){return a-b;});
}
var x=arr[0];
return strs[0].slice(0,x);
};
犯错:
输入:[“c”,“c”]
输出:""
预期:“c”
原因:未考虑数组只有两个字符串的情况,比较后只有一个数值输入arr[],使原来的var x=arr.sort(function(a,b){return a-b;});无法运行,加入了if(arr.length>1)对此进行判断。
输入:[“a”]
输出:""
预期:“a”
原因:未考虑数组只有一个字符串的情况,后续的排序等函数都无法运行,修改了if(strs==null||strs.length<1)对此进行判断。
输入:[“abab”,“aba”,“abc”]
输出:“aba”
预期:“ab”
原因:未考虑有同样长度的公共前缀不同最小字符串时,加入了存取其余字符串和首位字符串公共前缀最大索引号的数组,并对其排序取出首位。
修正:
- 先判断其是否为null和只有一个字符串的情况,是则直接返回""。
- 对数组内的字符串根据字符串的长度进行排序。
- 将排序后的首位字符串和之后的字符串进行逐位对比,将它们的公共前缀的长度存入一个新建的数组内。
- 取出数组内的最小数字,据此对首位字符串进行切片,输出。