Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

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

Solutions

  • 1 Longest Common Prefix -- 11~13ms

    • 第一个映入大脑的是对每一个字符串,按字符位逐个比较,直到发现不相同的或者是有个字符串已经比较完了时,说明最大公共前缀已经找到。则时间复杂度是: \(O(MN)\) 其中 M 是字符数组的个数,N 是字符数组中最短字符串的长度。按这种思想的代码如下:
    class Solution {
    public:
    string longestCommonPrefix(vector<string> &strs) {
    if(strs.size()<=0)return string();
    int idx=0;
    string res;
    char c;
    string s=strs.at(0); //以第一个字串作为比较的基
    int n=s.size(),ns=strs.size();
    while(idx<n){
    c=strs.at(0).at(idx); //获取一个字符
    for(int i=0;i<ns;++i){ //循环和其他字串中对应位的字符进行比较
    s=strs.at(i);
    if(idx<s.size())
    if(s.at(idx)==c)continue;
    idx=n; //如果出现不相等或有字符串已结束,则退出循环
    break;
    }
    if(idx<n){
    res.push_back(c);
    }
    ++idx;
    }
    return res;
    }
    };
    • 分析了一下,这里占用时间的有两个:

      1. 每一次迭代时的字符串拷贝;
      2. 如果最短的字符串在最后一个比较或靠后比较,则就白白浪费了太多比较了,特别是字符串数组很大的时候。
    • 所以对方案 1 进行了改进,有了下面的方案 2 。
  • 2 Longest Common Prefix -- 8ms

    • 这种方案首先找到字串数组中最短的那个,并记录下其在字符数组中的下标,不进行拷贝,减少空间复杂度,同时,节省一点时间。
    • 其次,去除掉所有的字符串拷贝操作,除用于在大字符串数组情况下的优化时需要的变量外,尽量减少空间使用。可以看到,运行时间一下子减到了 8ms。说明还是有效果的。
    • 代码如下:
    class Solution {
    public:
    string longestCommonPrefix(vector<string> &strs) {
    if(strs.size()<=0)return string();
    int idx=0,base=0;
    string res;
    int ns=strs.size();
    while(idx<ns){
    if(strs.at(idx).size()<strs.at(base).size())
    base=idx;
    ++idx;
    }
    idx=0;
    char c;
    int n=strs.at(base).size();
    while(idx<n){
    c=strs.at(base).at(idx);
    for(int i=0;i<ns;++i){
    if(idx<strs.at(i).size())
    if(strs.at(i).at(idx)==c)continue;
    idx=n;
    break;
    }
    if(idx<n){
    res.push_back(c);
    }
    ++idx;
    }
    return res;
    }
    };
  • 3 Longest Common Prefix -- 8ms

    • 查阅了网友的解答,发现这样一种思路:
    • 以第一个字串为比较基的长度判定,逐位判断,如果发现有一个字串的长度小于或等于当前位,说明这个字串结束了,自然也应该结束函数;
    • 如果没有结束,逐位判断的方式使用:判断当前字串的当前位和下一个字串的当前位比较是否相同,不相同则结束。可以看到,效率还是很高的。
    class Solution {
    public:
    string longestCommonPrefix(vector<string> &strs) {
    if (strs.size() == 0) return "";
    string s;
    for (int i = 0; i < strs[0].length(); i++) {
    for (int j = 0; j < strs.size() - 1; j++) {
    if (strs[j + 1].length() <= i || strs[j][i] != strs[j + 1][i]) {
    return s;
    }
    }
    s.push_back(strs[0][i]);
    }
    return s;
    }
    };
    • 代码看起来很简洁,但我认为,代码还应该有改进方式,比如应该先遍历出最短的那个字串,同时,求strs.size()尽量放到循环外面来,因为其是一个常量,在内层循环中,如果字串数组很大,就会产生一定的无法消除的效率影响。同时,我更喜欢使用 ++i 代替 i++ ,因为这样,能减少一次寄存器存取。也许当数据量少时看不出来这些差距,但代码在手,能优尽优嘛!不过处理了这些,好像就没原来的好看了~~

      LeetCodeOJ刷题之14【Longest Common Prefix】的更多相关文章

      1. 【leetcode刷题笔记】Longest Common Prefix

        Write a function to find the longest common prefix string amongst an array of strings. 题解:以strs[0]为模 ...

      2. leetCode练题——14. Longest Common Prefix

        1.题目 14. Longest Common Prefix   Write a function to find the longest common prefix string amongst a ...

      3. 14. Longest Common Prefix【leetcode】

        14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...

      4. [LeetCode][Python]14: Longest Common Prefix

        # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...

      5. Leetcode 14. Longest Common Prefix(水)

        14. Longest Common Prefix Easy Write a function to find the longest common prefix string amongst an ...

      6. LeetCode第[14]题(Java): Longest Common Prefix

        题目:最长公共前缀 难度:EASY 题目内容: Write a function to find the longest common prefix string amongst an array o ...

      7. Java [leetcode 14] Longest Common Prefix

        小二好久没有更新博客了,真是罪过,最近在看linux的东西导致进度耽搁了,所以今晚睡觉前怒刷一题! 问题描述: Write a function to find the longest common ...

      8. 14. Longest Common Prefix 最长的公共字符串开头

        [抄题]: Write a function to find the longest common prefix string amongst an array of strings. 在 " ...

      9. 14. Longest Common Prefix

        题目: Write a function to find the longest common prefix string amongst an array of strings. Subscribe ...

      随机推荐

      1. UI组件化介绍

        组件化相关概念 怎么理解组件化开发 https://www.cnblogs.com/zs-note/p/7093323.html 前端组件化框架之路 https://blog.csdn.net/hap ...

      2. 【网络】默认路由、RIPv2、OSPF、EIGRP配置(全网全通)

        1:默认路由 遇到问题:给r2配置向右的单项默认路由,通过PC1去ping主机PC2,一直显示Request timed out, 解决方法:r2配置如下: r2(config)#ip route 0 ...

      3. 超文本传送协议 HTTP

        超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准. HTTP是一个属于应用层的面向对象的协议, ...

      4. Ionic3,懒加载(二)

        Ionic懒加载: 普通的ionic项目中,创建好每一个Component页面后,都需要在app.module.ts中进行declaration(声明)后才能进行调用,而这样的声明方式,及在APP加载 ...

      5. python_面向对象—代码练习

        """注意:代码切勿照搬,错误请留言指出""" import re ''' class Person: name='xxx' age=20 ...

      6. Angular4+NodeJs+MySQL 入门-05 接口调用

        接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...

      7. centos系统为php安装memcached扩展

        1. 通过yum安装 yum -y install memcached #安装完成后执行: memcached -h #出现memcached帮助信息说明安装成功 2. 加入启动服务 chkconfi ...

      8. 数据挖掘:提取百度知道QA中的影视信息

        1. 背景 网站上爬取了部分关于影视的百度知道QA,为了后续提高影视的搜索效果,需要基于百度知道QA的答案抽取相关的影视信息. 2. 流程 目前已有基础的媒资视频库信息,基于媒资视频库中的视频名称,构 ...

      9. mysql 存储过程(proceduce)查询一个表的结果插入另外一个表

        公司的时间戳存证业务,对发版过程中间数据处理需要用到存储过程.对此做一个简短记录,以免遗忘. DROP procedure record_timestamp_deal ; ##创建存储过程 creat ...

      10. Java学习第二十四天

        1:多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Lock锁 (2)死锁问题的描述和代码体现 (3)生产者和消费者多线程体现(线程间通信问题) 以学生作为资源来实现的 资源类:St ...