LeetCode:Longest Common Prefix

简介:

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


题目的意思说的不是很清楚,开始理解成了求任意两个字符串的前缀中的最长者。但是本题的意思是求所有字符串的最长公共前缀,即数组的所有字符串都包含这个前缀。

算法1:逐个字符比较,时间复杂度为O(N*L),N是字符串个数,L是最长前缀的长度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class  Solution {
public :
     string longestCommonPrefix(vector<string> &strs) {
         int  n = strs.size();
         string res;
         if (n == 0) return  res;
         for ( int  pos = 0; pos < strs[0].size(); pos++) //最长前缀的长度不超过strs[0].size(),逐个字符的比较
         {
             for ( int  k = 1; k < n; k++) //strs[0]的第pos个字符分别和strs[1...n-1]的第pos个字符比较
             {
                 if (strs[k].size() == pos || strs[k][pos] != strs[0][pos])
                     return  res;
             }
             res.push_back(strs[0][pos]);
         }
         return  res;
     }
};

============================

算法2:第0个字符串和其他字符串逐个求前缀 ,所有字符串的最长前缀长度 = min{ prefixLength(strs[0], strs[i]) ,  0 < i < n }     本文地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class  Solution {
public :
     string longestCommonPrefix(vector<string> &strs) {
         int  n = strs.size();
         if (n == 0) return  "" ;
         int  len = strs[0].size(); //最长前缀的长度
         for ( int  i = 1; i < n; i++)
         {
             int  k;
             for (k = 0; k < min(len, ( int )strs[i].size()); k++)
                 if (strs[0][k] != strs[i][k]) break ;
             if (len > k)len = k;
         }
         return  strs[0].substr(0, len);
     }
};

 

算法2的时间复杂度是O(N*M),N是字符串个数,M = strs[0]和其他字符串的前缀长度的平均值, 算法2中字符的比较次数要比算法1多。例如以下例子

 

strs[0]: abcdef

strs[1: abcde

strs[2: abcdk

strs[3]ab

按照算法1,只需要比较每个字符串的前3个字符;按照算法2,strs[0]和其他三个字符串分表需要比较6、5、3个字符






本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3856331.html,如需转载请自行联系原作者

目录
相关文章
|
11月前
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
40 0
|
11月前
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
45 3
LeetCode 424. Longest Repeating Character Replacem
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
101 0
LeetCode 424. Longest Repeating Character Replacem
LeetCode 409. Longest Palindrome
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。 在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
71 0
LeetCode 409. Longest Palindrome
LeetCode 395. Longest Substring with At Least K
找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。
84 0
LeetCode 395. Longest Substring with At Least K
|
Windows
LeetCode 388. Longest Absolute File Path
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。
75 0
LeetCode 388. Longest Absolute File Path
|
存储
LeetCode 329. Longest Increasing Path in a Matrix
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
66 0
LeetCode 329. Longest Increasing Path in a Matrix
|
算法
LeetCode 300. Longest Increasing Subsequence
给定一个无序的整数数组,找到其中最长上升子序列的长度。
47 0
LeetCode 300. Longest Increasing Subsequence
|
算法
LeetCode 128. Longest Consecutive Sequence
给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。
84 0
LeetCode 128. Longest Consecutive Sequence
|
Java 程序员 开发者
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
本文是《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲》的第二篇,前一篇文章已经列出了完整的解题思路,今天来将此思路转化为具体的Java代码
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化