题目

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

If there is no common prefix,return an empty string "".

Example1:

  Input:["flower","flow","flight"]

  Output:"fl"

Example2:

  Input:["dog","racecar","car"]

  Output:""

  Explanation: There is no common prefix among the input strings.


思路

思路一:暴力搜索

本题思路很简单,需要找到最长公共前缀,那么就需要有一个字符串作为基准,在其他字符串中寻找公共字符串。我们以第一个字符串为基准在其他字符串中寻找。寻找的终止条件:

  • 当前遍历的长度超过字符串长度
  • 基准字符串的第i个字符与当前字符串第i个字符不匹配。

思路二:优化搜索

寻找题目的隐含条件。 需要找的是公共字符串,那么以长度字符串为基准一定能加快程序的速度。此外,我们考虑将字符串数组排序。字符串的排序是按照字母来的,这样做的好处是将公共字符比较多的字符串集中起来,而公共字符比较少的将被放在数组(vector)的两端。例如例1的输入数组["flower","flow","flight"],排序后为:["flight", "flow", "flower"]。我们将第一个与最后一个字符串对比,搜寻公共子串。为了防止溢出,以第一个与最后一个长度较短的为基准查找。


Tips

Vector(STL)

主要是vector容器的begin()、end()和front()、back()函数。

(1)begin()

返回当前vector容器中起始元素的迭代器。

//定义一个int容器的迭代器
vector<int>::iterator iter; //声明并初始化一个int类型的容器
vector<int> vec={1, 2, 3, 4, 5}; iter = vec.begin(); //返回迭代器表示的元素内容
cout << *iter << endl; //结果为1
(2)end()

返回当前vector容器中末尾元素的迭代器。注意end()返回的是最后一位的下一位。

//定义一个int容器的迭代器
vector<int>::iterator iter; //声明并初始化一个int类型的容器
vector<int> vec={1, 2, 3, 4, 5}; iter = vec.end() - 1; //end()指向最后一位的下一位 //返回迭代器表示的元素内容
cout << *iter << endl; //结果为5
(3)front()

返回当前vector容器中起始元素的引用。

//声明并初始化一个int类型的容器
vector<int> vec={1, 2, 3, 4, 5}; //返回迭代器表示的元素内容
cout << vec.front() << endl; //结果为1
(4)back()

返回当前vector容器中末尾元素的引用。

//声明并初始化一个int类型的容器
vector<int> vec={1, 2, 3, 4, 5}; //返回迭代器表示的元素内容
cout << vec.back() << endl; //结果为5

List(python)

python的列表(List)是序列类型,因此与字符串有一些共同特点,列表与字符串的不同主要在于

  • 列表可以包含其他元素,而不仅包含字符。列表可以包含任何类型的元素序列,甚至可以包含不同类型元素混合的序列。
  • 列表是可变类型。
(1)创建python列表
List1 = [1, 2, 3, 4, 5]
List2 = ['a', 'b', 'c', 'd', 'e']
List3 = [1, 2, 'a', 'b']
(2)函数

对于一个列表A

  • len(A):返回列表A的长度,即元素个数。
  • min(A):返回列表A中的最小元素。如果A是列表的列表,则只考虑每个列表的第一个元素。
  • max(A):返回列表A中的最大元素。如果A是列表的列表,则只考虑每个列表的第一个元素。
  • sum(A):返回列表A所有元素的和,A中元素必须是数字。

C++

  • 思路1
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string s = "";
if(strs.size() == 0)
return "";
for(int i = 0; i < strs[0].length();i++) //以第一个元素为基准
{
char c = strs[0].at(i);
for(int j = 1;j < strs.size();j++)
{
if(i >= strs[j].length() || strs[j].at(i) != c)
return s;
}
s += c;
}
return s;
}
};
  • 思路2
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty())
return ""; sort(strs.begin(), strs.end()); int i = 0;
int len = min(strs[0].size(), strs.back().size());
while (i < len && strs[0][i] == strs.back()[i])
i ++; return strs[0].substr(0, i);
}
};

Python

  • 思路2
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return "" if len(strs)==1:
return strs[0] minStr = min(strs)
maxStr = max(strs) result = ""
for i in range(len(minStr)):
if minStr[i] != maxStr[i]:
return minStr[:i] return minStr

总结

写代码充分运用

  • 公共(以长度最短字符串作为基准)
  • 前缀(利用子字符串方法)

这两个关键字。

参考

[1] https://www.cnblogs.com/grandyang/p/4606926.html

14. Longest Common Prefix[E]最长公共前缀的更多相关文章

  1. LeetCode 14 Longest Common Prefix(最长公共前缀)

    题目链接:https://leetcode.com/problems/longest-common-prefix/?tab=Description   Problem: 找出给定的string数组中最 ...

  2. LeetCode OJ:Longest Common Prefix(最长公共前缀)

    Write a function to find the longest common prefix string amongst an array of strings. 求很多string的公共前 ...

  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. Longest Common Prefix

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

  7. [LeetCode]14. Longest Common Prefix最长公共前缀

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

  8. Leetcode No.14 Longest Common Prefix最长公共前缀(c++实现)

    1. 题目 1.1 英文题目 Write a function to find the longest common prefix string amongst an array of strings ...

  9. 【LeetCode】14. Longest Common Prefix 最长公共前缀

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:prefix, 公共前缀,题解,leetcode, 力扣 ...

随机推荐

  1. 高德地图修改gps定位点样式

    效果图 navi_map_gps_locked.png 图片1 图片2 修改 MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化 ...

  2. poj1094Sorting It All Out 拓扑排序

    做拓扑排序的题目,首先要知道两条定理: 1.最后得到的拓扑数组的元素个数如果小于n,则不存在拓扑序列.  (有圈) 2.如果一次入队的入度为零的点数大于1,则拓扑序列不唯一. (关系不确定) 本题有一 ...

  3. LoadRunner时间戳函数web_save_timestamp_param

    举例:1520822348346(13位,毫秒级)   做时间戳的目的是为了JS缓存和防止CSRF,在LR中可以简单的使用下面这个函数 web_save_timestamp_param 来生成时间戳 ...

  4. 验证码识别 Tesseract的简单使用和总结

    Tesseract是什么 OCR即光学字符识别,是指通过电子设备扫描纸上的打印的字符,然后翻译成计算机文字的过程.也就是说通过输入图片,经过识别引擎,去识别图片上的文字.Tesseract是一种适用于 ...

  5. bootstrap初用新得1

    ## 基本准备 1. 首先把相关软件窗口规划好,对于我的喜好,我喜欢把除了浏览器外的其他软件分为左右两个半屏.左边和右边很多软件之间是需要配合使用的:     * 左边: scss文件,ps的guid ...

  6. CentOS7环境RabbitMQ集群配置管理(转载)

    CentOS7环境RabbitMQ集群配置管理(转载)   CentOS7系统内核版本:3.10.0-514.26.2.el7.x86_64 一.对应主机host地址(三台主机host文件要保持一致) ...

  7. ios风格的时间选择插件

    1.起因 在上个项目中,客户希望时间选择插件可以是ios风格的那种,但是找了很久,发现并没有用vue的ios风格时间插件,于是自己便自己造了一个轮子. 2.插件效果 3.插件依赖以及安装使用 插件依赖 ...

  8. 自动化测试之firebug、firepath、IDE的使用

    1firebug安装-firefox添加组件-firebug 如图 firepath依赖于firebug 展示路径用,安装和firebug一样

  9. 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 1

    第一天 日期:2019/6/14 前言: 第1次会议在9C-405召开 4个人讨论了整体代码的框架.布局.找出需要改进的地方重点讨论.明确编码的具体分工,每个人搭建好环境. 1.1 今日完成任务情况以 ...

  10. Statement对象sql注入漏洞的问题

    现在通过mysql以及oracle来测试sql注入  漏洞 mysql中的注释#    oracle中的注释为-- 所以注入漏洞就产生了 //登录测试 public void login()throw ...