编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码如下:
public static String longestCommonPrefix(String[] strs) {
if(strs==null||strs.length==0) {
//当字符串数组为空时,返回""
return "";
}
String result=strs[0];
//拿到字符串数组的第一个字符串
int count=strs.length;
for(int i=1;i<count;i++) {
//循环遍历字符串数组
result=longestCommonPrefix(result, strs[i]);
//更新最长公共前缀
if(result.length()==0) {
break;
}
}
return result;
}
public static String longestCommonPrefix(String str1,String str2) {
int length=Math.min(str1.length(), str2.length());//拿到较短的字符串
int index=0;
while(index<length&&str1.charAt(index)==str2.charAt(index)) {
//遍历字符串,直到遍历完较短的字符串或者两个字符串没有公共前缀时退出循环
index++;
}
return str1.substring(0, index);
//截取字符串的公共前缀
}
代码如下:
public static String longestCommonPrefix(String[] strs) {
if(strs.length==0||strs==null) {
return "";
}
int length=strs[0].length();//数组中第一个字符串的长度
int count=strs.length;
for(int i=0;i<length;i++) {
char c=strs[0].charAt(i);
for (int j = 1; j < count; j++) {
//遍历数组每一个字符串
if (i == strs[j].length() || strs[j].charAt(i) != c) {
//当字符串长度和某个字符串长度相等或者某个字符串某列字符和当前最长公共前缀不相等
return strs[0].substring(0, i);
//返回第一个字符串截取到第i位即为最大公共前缀
}
}
}
return strs[0];
}
代码如下:
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
} else {
return longestCommonPrefix(strs, 0, strs.length - 1);
}
}
public static String longestCommonPrefix(String[] strs, int start, int end) {
if (start == end) {
//当数组长度等于1,返回唯一的字符串
return strs[start];
} else {
int mid = (end - start) / 2 + start;
//将数组分成两个数组
String lcpLeft = longestCommonPrefix(strs, start, mid);
String lcpRight = longestCommonPrefix(strs, mid + 1, end);
return commonPrefix(lcpLeft, lcpRight);
}
}
public static String commonPrefix(String lcpLeft, String lcpRight) {
int minLength = Math.min(lcpLeft.length(), lcpRight.length());
//拿到两个字符串较短的一个
for (int i = 0; i < minLength; i++) {
//循环较短字符串长度的次数
if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
//当两个字符串某位字符不相等时,返回字符串截取到i的位置
return lcpLeft.substring(0, i);
}
}
return lcpLeft.substring(0, minLength);
}
代码如下:
public static String longestCommonPrefix(String[] strs) {
if(strs==null||strs.length==0) {
return "";
}
int minLength=Integer.MAX_VALUE;
for (String s : strs) {
//循环遍历数组拿到数组中的最短字符串长度
minLength=Math.min(minLength, s.length());
}
int low=0,high=minLength;
while(low<high) {
int mid=(high-low+1)/2+low;
if(isCommonPrefix(strs, mid)) {
low=mid;
}else {
high=mid-1;
}
}
return strs[0].substring(0, low);
}
public static boolean isCommonPrefix(String[] strs, int length){
String str0=strs[0].substring(0, length);
int count=strs.length;
for(int i=1;i<count;i++){
//循环遍历数组
String s=strs[i];
for(int j=0;j<length;j++) {
//循环遍历当前的中间值次
if(str0.charAt(j)!=s.charAt(j)) {
//如果对应字符不相等时,返回false
return false;
}
}
}
return true;
}