LeetCodeOJ刷题之14【Longest Common Prefix】
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 。
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】的更多相关文章
- 【leetcode刷题笔记】Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. 题解:以strs[0]为模 ...
- leetCode练题——14. Longest Common Prefix
1.题目 14. Longest Common Prefix Write a function to find the longest common prefix string amongst a ...
- 14. Longest Common Prefix【leetcode】
14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...
- [LeetCode][Python]14: Longest Common Prefix
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...
- Leetcode 14. Longest Common Prefix(水)
14. Longest Common Prefix Easy Write a function to find the longest common prefix string amongst an ...
- LeetCode第[14]题(Java): Longest Common Prefix
题目:最长公共前缀 难度:EASY 题目内容: Write a function to find the longest common prefix string amongst an array o ...
- Java [leetcode 14] Longest Common Prefix
小二好久没有更新博客了,真是罪过,最近在看linux的东西导致进度耽搁了,所以今晚睡觉前怒刷一题! 问题描述: Write a function to find the longest common ...
- 14. Longest Common Prefix 最长的公共字符串开头
[抄题]: Write a function to find the longest common prefix string amongst an array of strings. 在 " ...
- 14. Longest Common Prefix
题目: Write a function to find the longest common prefix string amongst an array of strings. Subscribe ...
随机推荐
- 【研究】CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)
1.1.1 漏洞描述 在2015年4月安全补丁日,微软发布的众多安全更新中,修复了HTTP.sys中一处允许远程执行代码漏洞,编号为:CVE-2015-1635(MS15-034 ).利用HTTP. ...
- 剑指offer——面试题15:二进制中 1的个数
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...
- Oracle RAC集群搭建(一)-ASM共享存储卷
01, ASM共享存储卷 安装集群的话,必须要有共享磁盘,目的是为作裁决磁盘使用.还需要有数据文件的共享磁盘 02,规划 主机 裁决磁盘 数据 rac1 1G*1 20 ...
- lua-遍历集合-ipairs和pairs的区别
--ipairs和pairs的区别arr = {1,3,[5]=5,name="kaikai",age=12, 89}--arr[4]= 23--ipairs--ipairs仅仅遍 ...
- shell中if的可判断的类型
-d :判断制定的是否为目录-z:判断制定的变量是否存在值-f:判断制定的是否为文件-L:判断制定的是否为符号链接-r:判断制定的是否可读-w:判断制定的是否可写-x:判断存在的对象是否可以执行!:测 ...
- windows环境下MySQL-5.7.12-winx64下载安装与配置
系统:64位Win-7 官网压缩包:mysql-5.7.12-winx64.zip 前后花了一些时间,以前都是下载软件直接安装在本地,现在这个不一样,下载压缩包后要解压缩到安装目录,然后在控制台下配置 ...
- PHP邮件发送
php带有内置的mail() 发送邮件函数,但是较为繁琐:建议上网下载一个PHPMailer:
- React.js 小书 Lesson15 - 实战分析:评论功能(二)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson15 转载请注明出处,保留原文链接和作者信息. 上一节我们构建了基本的代码框架,现在开始完善其 ...
- js 中移动元素的方法
2017-12-13 19:59:24 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- spring 依赖注入总结--为什么官方推荐构造器注入
一 公司小伙伴使用了构造器注入,说是spring的官方推荐.但是,我问了三个问题,他都答不出来,感觉能写篇博文. 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? ...
- 【leetcode刷题笔记】Longest Common Prefix