https://leetcode-cn.com/problems/longest-common-prefix/

原题

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

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

示例 1:
输入: [“flower”,”flow”,”flight”]
输出: “fl”

示例 2:
输入: [“dog”,”racecar”,”car”]
输出: “”

解释: 输入不存在公共前缀。
说明: 所有输入只包含小写字母 a-z 。

题目分析

确定一下题意,前缀是指从头开始的字符串,公共是指数组中的所有字符串都需要有的字符串。
最直观的方法是,设置最长前缀为数组第一个元素,然后遍历数组依次比较当前的最长前缀和当前元素,然后更新最长前缀继续与下一个元素比较。
image.png

  1. const longestCommonPrefixStr = (str1, str2) => {
  2. let ans = ''
  3. for (let i = 0; i < Math.min(str1.length, str2.length); i++) {
  4. if (str1[i] === str2[i]) {
  5. ans += str1[i]
  6. } else {
  7. return ans
  8. }
  9. }
  10. return ans
  11. }
  12. const longestCommonPrefix = (strs) => {
  13. if (!strs.length) return ''
  14. let ans = strs[0]
  15. for (let i = 1; i < strs.length; i++) {
  16. ans = longestCommonPrefixStr(ans, strs[i])
  17. }
  18. return ans
  19. }

既然是公共前缀,那我们可以找一个公共前缀的基准例如数组的第一个元素,遍历其他数组,如果其他数组都含有这个前缀,则这个公共前缀为最长的公共前缀。如果其他元素没有这个前缀,则更新公共前缀的长度-1,再去数组中匹配,直到找到所有数组都含有的前缀。
image.png

  1. const longestCommonPrefix = (strs) => {
  2. if (!strs.length) return ''
  3. let ans = strs[0]
  4. for (let i = 0; i < strs[0].length; i++) {
  5. let has = true
  6. for (let j = 1; j < strs.length; j++) {
  7. if (strs[j].indexOf(ans) === -1) {
  8. has = false
  9. break
  10. }
  11. }
  12. if (has) {
  13. break
  14. } else {
  15. ans = ans.slice(0, ans.length - i - 1)
  16. }
  17. }
  18. return ans
  19. }