算法学习自记录/最长公共前缀

103 阅读2分钟

最长公共前缀


题目

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

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


解答

我的分析

一句话总结题目

字符串数组的最长公共前缀

输入输出
['flow','fliw','flloq']'fl'

自己的解法思路

1,循环查找数组每一个值

2,每个值与后面的值一一对比

3,找到第一个不是的,前面的几个则为最长公共前缀

(实践时纠结怎么两两比较不会出现比较错误的情况)


我的答案

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    // 1,循环查找数组每一个值
    // 2,每个值与后面的值一一对比
    // 3,找到第一个不是的,前面的几个则为最长公共前缀

    for(let i=0;i<strs.length;i++){
        let new_str = strs[i];
        let ans = '';
        for(let j=0;j<new_str.length;i++){
            if(strs[i][j]==strs[i+1][j]){
                //没想懂这里怎么无限对比下一个值?
            }
        }
    }
};

标准答案

/**
 * @param {string[]} strs
 * @return {string}
 * 运用链表的思想
 */
 var loogestCommonPrefix = function(strs){
    //当字符串数组长度为0时,公共前缀也为空,返回""
    if(strs.length == 0) return '';
    
    //初始化,将第一个字符串作为最长前缀
    let ans = strs[0];
    
    //遍历字符串,依次与ans进行比较,两两找到公共前缀,最后的结果是最长公共前缀。
    for(let i;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)
        
    //如果查询中,发现ans为空,则公共前缀不存在,直接返回“”
        if(ans === ''){
            return ans;
        }
    }
    return ans;
 }


答案分析

先分析特殊情况:当字符串长度为0时,公共前缀也就为空。

重点思路:

1,排除特殊条件

2,两两对比找到公共前缀,找到不符合条件的某一个字符j,返回公共前缀截止于j前的所有字符作为最大公共前缀


结论

自我总结

1,substr?

抽取指定数目的字符

使用:str.substr(start,end) => ans

字符含义
str被抽取的字符
start开始下标
start结束下标
ans返回结果(抽取后的字符)

2,链表?

链表是一种数据结构,用于储存和操作一系列的元素。

它由一系列的节点(Node)组成,每个节点又包含了两个部分:数据域(存储数据)和指针域(指向下一个节点)。通过这种方式,链表中的节点可以按顺序链接在一起,形成一个链式结构

添加或移除元素的时候不需要移动其他元素,这是链表最大的好处

引申思考

当出现多层嵌套的数据,先确定一个值后,两两比较。


题目来源:力扣(LeetCode)

链接来源:leetcode.cn/problems/lo…

其他来源:CSDN

链接来源:blog.csdn.net/weixin_4899…