leetcode-14-最长公共前缀

1,551 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

题目地址

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

解题思路

本题要我们获取字符串数组的最长公共前缀,其实思路很简单,就是从第一个字符开始,遍历字符串数组中的每个字符串,比较当前字符是否相同,如果都相同,则累加结果字符串并继续向后对比,否则在当前位置停止,返回之前累加的结果字符串。
具体思路如下:

  1. let tail = 0 用来记录当前对比字符的下标;
  2. let cur = '' 用来记录当前对比的字符的值;
  3. let flag = true 本次字符对比是否全部相同;
  4. 最外层使用 while 循环包裹,在 flag 为真的时候一直循环内部逻辑;
  5. 如果当前处理的是第一个字符串,说明开始了一次新的循环,根据记录的下标 tail 更新 cur;
  6. 否则通过 tail 获取当前字符串本地对比的字符和 cur 对比,如果不同,则标记 flag = false,并退出循环;
  7. 如果当前处理的是最后一个字符串,则说明本次循环对比成功,更新下标 tail 向后移动一位。
  8. while 循环结束,说明已经获取到了第一个不满足条件的下标位置,根据该下标截取第一个字符串即字符串数字的最长公共前缀。

代码实现

var longestCommonPrefix = function(strs) {
    let len = strs.length
    let tail = 0
    let cur = ''
    let flag = true

    while(flag){
        for(let i = 0;i<len;i++){
            if(i===0){
                if(strs[i][tail]){
                    cur = strs[i][tail]
                }else{
                    flag = false
                }
            }else if(strs[i][tail] !== cur){
                flag = false
                break
            }

            if(i === len-1){
                tail++
            }
        }
    }
    return strs[0].substr(0,tail);
}

至此我们就完成了 leetcode-14-最长公共前缀

如有任何问题或建议,欢迎留言讨论!