编写一个函数来查找字符串数组中的最长公共前缀。
    如果不存在公共前缀,返回空字符串 ""
    示例 1:

    1. 输入: ["flower","flow","flight"]
    2. 输出: "fl"

    示例 2:

    1. 输入: ["dog","racecar","car"]
    2. 输出: ""
    3. 解释: 输入不存在公共前缀。

    解法1:逐个比较

    1. var longestCommonPrefix = function (strs) {
    2. if (strs == null || strs.length === 0) return "";
    3. let first = strs[0];
    4. for (let i = 1; i < strs.length; i++) {
    5. let j = 0;
    6. for (; j < first.length && j < strs[i].length; j++) {
    7. if (first[j] !== strs[i][j]) break;
    8. }
    9. first = first.substring(0, j);
    10. if (!first) return "";
    11. }
    12. return first;
    13. }

    解法2:比较最大字符串和最小字符串

    1. var longestCommonPrefix = function (strs) {
    2. if (strs == null || strs.length === 0) return "";
    3. let max = strs[0];
    4. let min = strs[0];
    5. for (let i = 1; i < strs.length; i++) {
    6. max = strs[i] > max ? strs[i] : max;
    7. min = strs[i] > min ? min : strs[i];
    8. }
    9. let i = 0;
    10. for (; i < min.length; i++) {
    11. if(min[i]!==max[i]) break;
    12. }
    13. return min.substring(0,i);
    14. }

    解法3:分治思想
    将求N个字符串最长公共前缀的问题,拆解为求2个字符串最长公共前缀的子问题,最后归并2个字符串求值结果。

    1. var longestCommonPrefix = function (strs) {
    2. if (strs == null || strs.length === 0) return "";
    3. return longestPrefix(strs);
    4. }
    5. function longestPrefix(strs){
    6. if(strs.length === 1) return strs[0];
    7. const middle = Math.floor(strs.length/2);
    8. const left = strs.slice(0, middle);
    9. const right = strs.slice(middle);
    10. return longestPrefixTwo(longestPrefix(left),longestPrefix(right));
    11. }
    12. function longestPrefixTwo(str1, str2){
    13. let i = 0;
    14. for (; i < str1.length && i < str2.length; i++) {
    15. if(str1[i]!==str2[i]) break;
    16. }
    17. return str2.substring(0,i);
    18. }