leetCode – 最长公共前缀
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
测试用例
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
题目分析
- 本题可以进行纵向扫描也可以进行横向扫描
- 纵向扫描是指一开始就比较每一个字符串的一个字母,如果相同则返回,直到出现不同。如果一开始就不同则直接返回""
- 横向扫描是指前两个字符串比较出来后的结果跟后面第三个比较,直到比较完毕,如果一开始就没有相同则返回""
- 二分法解题
解题方法
一.纵向扫描
解题思路
- 先判断字符串数组是否为空或者长度为0,是返回"",否则执行下面的操作
- 从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同
- 如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀
- 当前列之前的部分为最长公共前缀
解题代码
class Solution {
public String longestCommonPrefix(String[] strs) {
//首先判断字符串数组是否为空或者长度为0
if(strs == null || strs.length == 0) return "";
//取出数组长度
int count = strs.length;
//取出第一个字符串长度
int length = strs[0].length();
//遍历第一个字符串
for(int i = 0;i < length;i ++){
//取出第i个字符
char c = strs[0].charAt(i);
//遍历剩下的字符串
for(int j = 1;j < count;j ++){
//如果字符串和前面的遍历出来的字符长度一样
//比如我遍历到了abc的第四位,i=3,而取出的字符串只有3位
//或者取出的字符不一致,停止遍历
if(strs[j].length() == i || c != strs[j].charAt(i)){
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
}
测试结果
二.横向扫描
解题思路
- 依次遍历字符串数组中的每个字符串
- 对于每个遍历到的字符串,更新最长公共前缀
- 当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。
- 如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。
解题代码
class Solution {
public String longestCommonPrefix(String[] strs) {
//先判断数组是不是空或长度为零
if(strs == null || strs.length == 0) return "";
//取出数组长度
int count = strs.length;
//取出第一个字符串
String same = strs[0];
for(int i = 1;i < count;i ++){
//用函数取出相同值
same = commonPrefix(same,strs[i]);
//如果值不同那么直接返回""
if(same.length() == 0){
return same;
}
}
return same;
}
private String commonPrefix(String str1, String str2){
//取出两个字符串中较小的
//为什么用这种方式而不是直接用字符串2和字符串1比较,如果2小于1就停止,因为不能忽略刚开始的循环
int length = Math.min(str1.length(),str2.length());
//索引值
int flag = 0;
//如果字符串比0大则循环取出相同的
while(flag < length && str1.charAt(flag) == str2.charAt(flag)){
flag ++;
}
//返回相同的字符串
return str1.substring(0,flag);
}
}
测试结果
三.倒序扫描
解题思路
- 类似横向扫描,先初始化第一个字符串
- 然后用增强for循环取出字符串进行比较
- 如果不是以相同的字符串开始,就减去一个长度
- 直到相同
- 返回值就是最长索引值
解题代码
class Solution {
public String longestCommonPrefix(String[] strs) {
//先判断是不是空或长度为0
if(strs.length == 0||strs == null) return "";
//初始化第一个字符串
String same = strs[0];
//循环取出字符串
for(String str : strs){
//当后面的字符串不是以前面的字符串开始的时候
while(!str.startsWith(same)){
//特殊情况,第一个字符串为"",直接返回""
if(same.length() == 0){
return "";
}
//否则减一继续循环,直到相同
same = same.substring(0,same.length() - 1);
}
}
return same;
}
}
测试结果
二分法自己去了解吧!