每日算法-最长公共前缀(分治-简单)

421 阅读2分钟

题目

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

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

这个题容易让人理解错误,这里要找的是公共前缀

示例 1:

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

示例 1:

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

遍历

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) { // 前缀
  if(strs.length == 0)
      return "";
  let ans = strs[0];
  for(let i =1;i<strs.length;i++) {
      let j=0;
      for(;j<ans.length && j < strs[i].length;j++) {
          if(ans[j] != strs[i][j])
              break;
      }
      ans = ans.substr(0, j);
      if(ans === "")
          return ans;
  }
  return ans;
};

分治

var longestCommonPrefix = function(strs) { // 分治
  if (strs === null || strs.length === 0) return "";
  return lCPrefixRec(strs)
};

// 若分裂后的两个数组长度不为 1,则继续分裂
// 直到分裂后的数组长度都为 1,
// 然后比较获取最长公共前缀
function lCPrefixRec(arr) {
let length = arr.length
if(length === 1) {
  return arr[0]
}
let mid = Math.floor(length / 2),
    left = arr.slice(0, mid),
    right = arr.slice(mid, length)
return lCPrefixTwo(lCPrefixRec(left), lCPrefixRec(right))
}

// 求 str1 与 str2 的最长公共前缀
function lCPrefixTwo(str1, str2) {
  let j = 0
  for(; j < str1.length && j < str2.length; j++) {
      if(str1.charAt(j) !== str2.charAt(j)) {
          break
      }
  }
  return str1.substring(0, j)
}
let result = longestCommonPrefix(["flower","flow","flight", "flo"])
console.log(result)

总结

  • 阅读清楚题目
  • 分治定义将一个复杂的问题,分成两个或多个相似的子问题,在把子问题分成更小的子问题,直到更小的子问题可以简单求解,求解子问题,则原问题的解则为子问题解的合并。