leetCode第14题——最长公共前缀
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetCode第14题——最长公共前缀相关的知识,希望对你有一定的参考价值。
一、题目
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
二、思路及图解 (横向比较的方式实现)
1、思路
- 将字符串水平排列,第 0 个字符串flower和第 1 个字符串flower找最长子串,结果为 flower,
- 再把结果和第 2 个字符串flow比较,结果为 flow,
- 再把结果和第 3 个字符串flight比较,结果为 fl,即为最终结果。
2、图解
三、题目代码解析(横向比较的方式实现)
1、代码
public class Test {
public static void main(String[] args) {
String[] strs={"flower","flow","flight"};
//横向比较的方式实现
String str=longestCommonPrefix(strs);
System.out.println("最长公共前缀为【"+str+"】");
}
/**
* 横向比较的方式实现
*/
public static String longestCommonPrefix(String[] strs){
if(strs==null || strs.length==0){
return "";
}
//初始化前缀为数组下标为0的位置字符串,即flower
String prefix = strs[0];
//依次遍历字符串数组中的每个字符串
for(int i=0;i<strs.length;i++){
/**
* 第1次遍历把初始化的前缀flower和遍历的第1个字符串flower比较
* 第2次遍历把第1次遍历的公共前缀结果flower和第2个字符串flow比较
* 第3次遍历把第2次遍历的公共前缀结果flow和第3个字符串flight比较
* 返回第3次遍历的公共前缀结果fl
*/
prefix = longCommonPrefix(prefix,strs[i]);
if (prefix.length() == 0) {
break;
}
}
return prefix;
}
public static String longCommonPrefix(String str1,String str2){
//获取2个字符串的最小长度
int length = Math.min(str1.length(), str2.length());
//初始值的长度为0
int index = 0;
//如果初始值的长度 小于 字符串最小长度
//并且 字符串str1中的每一个字符和字符串str2中的每一个字符相等,
//则长度每次+1
while (index < length && str1.charAt(index) == str2.charAt(index)) {
index++;
}
//截取字符串中从0到最大的长度的字符串并返回
return str1.substring(0, index);
}
}
2、结果如下图:
3、复杂度分析
- 时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
- 空间复杂度:O(1)。使用的额外空间复杂度为常数。
四、思路及图解 (纵向比较的方式实现)
1、思路
- 纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,
- 如果相同则继续对下一列进行比较,
- 如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。
2、图解
五、题目代码解析(纵向比较的方式实现)
1、代码
public class Test {
public static void main(String[] args) {
String[] strs={"flower","flow","flight"};
//纵向比较的方式实现
String str=longestCommonPrefixs(strs);
System.out.println("最长公共前缀为【"+str+"】");
}
/**
* 纵向比较的方式实现
*/
public static String longestCommonPrefixs(String[] strs){
if(strs == null || strs.length==0){
return "";
}
//遍历所有列
for (int i = 0; i < strs[0].length(); i++) {
//保存 i 列第 0 行的字符便于后续比较
char c = strs[0].charAt(i);
//比较第 1,2,3... 行的字符和第 0 行是否相等
for (int j = 1; j < strs.length; j++) {
/**
* i == strs[j].length() 表明当前行已经到达末尾
* strs[j].charAt(i) != c 当前行和第 0 行字符不相等
*/
if (i == strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}
2、结果如下图:
3、复杂度分析
- 时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
- 空间复杂度:O(1)。使用的额外空间复杂度为常数。
以上是关于leetCode第14题——最长公共前缀的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。
Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。