LeetCode #14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 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”
原因:未考虑有同样长度的公共前缀不同最小字符串时,加入了存取其余字符串和首位字符串公共前缀最大索引号的数组,并对其排序取出首位。


修正:
  1. 先判断其是否为null和只有一个字符串的情况,是则直接返回""。
  2. 对数组内的字符串根据字符串的长度进行排序。
  3. 将排序后的首位字符串和之后的字符串进行逐位对比,将它们的公共前缀的长度存入一个新建的数组内。
  4. 取出数组内的最小数字,据此对首位字符串进行切片,输出。

猜你喜欢

转载自blog.csdn.net/oMarke/article/details/83190069