leetcode----最长公共前缀

题目:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""

示例 1:

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

示例 2:

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

初学算法, 没什么思路。 在网络上搜索到四种解题思路,打算一一尝试。 

思路来源:https://www.aliyun.com/jiaocheng/17602.html

方法一:横向遍历。 以第一个string为标准,依次判断是否是前缀,如果不是就减一,直到为前缀。

我的代码:

    var longestCommonPrefix = function( strs ) {
        var maxNum = strs.length - 1; // 数组长度
        if (maxNum < 0) return ""; // -1 取反为 true
        else if (maxNum === 0) return strs[maxNum];
        else{
            var temp = strs[0]; // 记录第一个字符串为LCP(公共前缀)
            var num = 1; // 记录比较位置
            while(temp){
                if (temp === strs[num] ) {
                    temp = strs[num];
                }else if( temp !== strs[num] ) {
                    var len = temp.length > strs[num].length ? temp.length : strs[num].length;
                    for (var i = 0 ; i < len ; i++) {
                        if (temp.charAt(i) !== strs[num].charAt(i)) {
                            temp = temp.substr(0, i);
                            break;
                        }
                    }
                }
                if (num === maxNum) break; //判断是否到最后一个
                else {
                    num++;
                }
            }
        }
        return temp;
    };

刚写完自己还比较开心, 但发现我的执行时间为100ms+时, 和leetcode上别人的时间比多了不是一点半点。 尝试完其余方法后, 就去leetcode上研究别人的思路了。

方法二:纵向遍历。 从第一个字符开始遍历,知道找到所有字符串出现不一样的字符为止

我的代码:

    var longestCommonPrefix = function (strs) {
        var maxLen = strs.length;
        if (maxLen === 0) return "";
        if (maxLen === 1) return strs[0];
        var temp = ""; // 存放LCP
        var num = null; // 记录位置
        var str = strs[0];
        for (var i = 0; i < str.length; i++) {
            for (var j = 0 ; j < maxLen - 1; j++) {
                if (strs[j][i] !== strs[j+1][i]) {
                    return temp;
                }
                num = i + 1;
            }
                temp = str.substr(0, num);
        }
        return temp;
    };

这次比上次快了30ms, 看来选择不同方法速度就会有明显改善。 算法真好玩。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值