编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]输出: "fl"
示例 2:
输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。
解法1:逐个比较
var longestCommonPrefix = function (strs) {if (strs == null || strs.length === 0) return "";let first = strs[0];for (let i = 1; i < strs.length; i++) {let j = 0;for (; j < first.length && j < strs[i].length; j++) {if (first[j] !== strs[i][j]) break;}first = first.substring(0, j);if (!first) return "";}return first;}
解法2:比较最大字符串和最小字符串
var longestCommonPrefix = function (strs) {if (strs == null || strs.length === 0) return "";let max = strs[0];let min = strs[0];for (let i = 1; i < strs.length; i++) {max = strs[i] > max ? strs[i] : max;min = strs[i] > min ? min : strs[i];}let i = 0;for (; i < min.length; i++) {if(min[i]!==max[i]) break;}return min.substring(0,i);}
解法3:分治思想
将求N个字符串最长公共前缀的问题,拆解为求2个字符串最长公共前缀的子问题,最后归并2个字符串求值结果。
var longestCommonPrefix = function (strs) {if (strs == null || strs.length === 0) return "";return longestPrefix(strs);}function longestPrefix(strs){if(strs.length === 1) return strs[0];const middle = Math.floor(strs.length/2);const left = strs.slice(0, middle);const right = strs.slice(middle);return longestPrefixTwo(longestPrefix(left),longestPrefix(right));}function longestPrefixTwo(str1, str2){let i = 0;for (; i < str1.length && i < str2.length; i++) {if(str1[i]!==str2[i]) break;}return str2.substring(0,i);}
