最长公共前缀

503 阅读1分钟

最长公共前缀

原题目最长公共前缀

题目介绍

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

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

  • 示例 1:

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

  • 示例 2:

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

解法1

我们可以定义一个函数求两个字符串的公共前缀getLongestCommonPrefixByTwoString(str1, str2)

这时候我们每次求出的公共前缀和下一个字符串再求公共前缀,直至最后一个,就可以得出我们最终想要的结果了。

/**
 * @param {string[]} strs
 * @return {string}
 */
var getLongestCommonPrefixByTwoString = function(string1, string2) {
  for(let i = 0; ;i++) {
    if(!string1[i] || !string2[i] || string1[i] !== string2[i]) {
      return string1.slice(0, i)
    }
  }
}
var longestCommonPrefix = function(strs) {
  if(strs.length < 2) {
    return strs[0] || ''
  }
  return strs.reduce((str1, str2) => getLongestCommonPrefixByTwoString(str1, str2))
};

解法2

假设我们的输入是:

[
	'1234567890a',
	'1234567890a',
	'1'
]

如果用解法1,这时候我们需要运行23次,才能得出最终的结果。但是我们知道,我们实际上只需要依次比较输入的数组的前缀6次就能得到最终的答案。

因此我们作出以下优化:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
  if(strs.length < 2) {
    return strs[0] || ''
  }
  for(let i = 0; ;i++) {
    for(let j = 1; j < strs.length ;j++) {
      if(
        !strs[j-1] ||
        !strs[j] ||
        !strs[j-1][i] ||
        !strs[j][i] ||
        strs[j-1][i] !== strs[j][i]
      ) {
        return strs[0].slice(0, i)
      }
    }
  }
};