14.Longest Common Prefix

Description

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

Example 1:


Input: ["flower","flow","flight"]
Output: "fl"

Example 2:


nput: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Note:

All given inputs are in lowercase letters a-z.

分析和方案

求一个字符串数组中,共同的最长的开始文字段

思路,先比对头两个字符串中,最长的相同文字头,然后拿来和第三个比较,以此类推

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs == null || strs.length == 0) return "";

    // same表示目前發現的共同字首,一開始為strs[0]
    var same = strs[0];

    // 只需要比對same跟目前字串共同的字元就好
    for(var i = 1 ; i<strs.length ; i++){
        var str = strs[i];

        // 取目前的字串str跟same相等的部分做為新的same
        var j = 0;
        for(; j < same.length ; j++){
           if(same[j] != str.charAt(j)){
                break;
           } 
        }
        // same與目前字串str前幾位相同,就做為新的same
        same = same.slice(0,j);
    }

    return same;
};

或者:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    var out = ''
    if(strs.length === 0) return out
    if(strs.length === 1) return strs[0]
    var s = strs[0]
    for ( i = 0; i < s.length; i++){
        for ( j = 1; j < strs.length; j++){

            if(strs[j][i] && strs[j-1][i] && strs[j][i] === strs[j-1][i]){
                // console.log('a,',strs[j][i],j,i,out)
                if (j===strs.length-1) out += strs[j][i]
            }else{
                return out
            }
        }
    }
    return out
};

最快

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if (strs === null || strs.length === 0) {
        return "";
    }

    var isCommonPrefix = function(strs, len) {
        var substr = strs[0].substring(0, len);
        for (i = 1; i < strs.length; i++) {
            if (!strs[i].startsWith(substr)) { return false; }
        }
        return true;
    }

    var minLen = Number.MAX_SAFE_INTEGER;
    for (i = 0; i < strs.length; i++) {
        minLen = Math.min(minLen, strs[i].length);
    }
    var low = 1;
    var high = minLen;
    while (low <= high) {
        var middle = Math.floor((low + high) / 2);
        if (isCommonPrefix(strs, middle)) {
            low = (middle + 1);
        }
        else {
            high = (middle - 1);
        }
    }
    return strs[0].substring(0, Math.floor((low+high)/2));
};

第二

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    var index= 0;
    var len = strs.length;
    if(len == 0) {return '';}
    var temp = strs[0].length;
    for(var i = 0; i<strs.length;i++){
        if(strs[i].length < temp){
            temp = strs[i].length;
            index = i;
        }
    }
    var res = '';
    var b = false;
    for(var i = 0;i<strs[index].length; i++){
        for(var j = 0; j<strs.length; j++){
            if(strs[j][i] !== strs[index][i]){
                b = true;
                break;
            }
        }
        if(b){
            break;
        }else{
            res += strs[index][i];    
        }

    }
    return res;
};

第三

/**
 * @param {string[]} strs
 * @return {string}
 */
function findShortestWord(strs) {
    let shortestWordLength = strs[0].length;

    for (let i = 1; i < strs.length; i++) {
        if (shortestWordLength > strs[i].length) {
            shortestWordLength = strs[i].length;
        }
    }
    return shortestWordLength;
}

let longestCommonPrefix = function(strs) {
    if (strs.length == 0) {
        return "";
    } else if (strs.length == 1) {
        return strs[0];
    }

    let shortestWordLength = findShortestWord(strs);
    let longestCommonPre = "";
    let firstWord = strs[0];

    for (let i = 0; i < shortestWordLength; i++) {
        j = 1;
        while (strs.length > j) {
            if (firstWord.charAt(i) !== strs[j].charAt(i)) {
                return longestCommonPre;
            } 
            j++;
        }
        longestCommonPre += firstWord.charAt(i);
    }
    return longestCommonPre;
};

results matching ""

    No results matching ""