求出一个字符串数组的最长公共前缀
//编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串
import java.util.Arrays;
//例如:
/*
* ["flower","flow","flight"]
* "fl"就是最长公共前缀
*
* ["dog",""racecar","car"]
* ""这是个不存在的公共前缀
* */
public class Main {
//先自己思考一下思路。
//在学习java基础的时候、介绍了两个实用类 Arrays,和Collections类,前一个是操作数组的 后一个是操作集合的
// 在这里可以利用他Arrays实用类
// 先利用Arrays.sort方法为数组排序 再将数组和第一个元素和最后一个元素的字符从前往后比对即可
public static String longestCommonPrefix(String[] strs){
//如果检查不合法就返回公共字符串
//传进来的参数传给这个方法
if(!checkStrs(strs)){
return "";//先判断简单的,都是这么做的
}
int length = strs.length;//拿到数组整个长度用于遍历
//创建一个新的字符串来保存结果
StringBuffer res=new StringBuffer();
//给字符串的数组按升序排列
//为什么需要排序 为了简化比较次数. 排了序我就只用比较第一个和最后一个中间那个不用管
Arrays.sort(strs);
//拿到数组第0个元素的长度
int m=strs[0].length();
//拿到数组最后一个元素的长度
int n=strs[length-1].length();
//哪个更短
int num=Math.min(m,n);
//循环短的长度就可以了,小的比较可以简化比较次数。
for (int i = 0; i <num ; i++) {
//数组的第一个元素,元素中的字母 和数组中的最后一个元素 最后一个元素的字母 比较相等
if(strs[0].charAt(i)==strs[length-1].charAt(i))
{
//就把这个元素添加到我们创建的StringBuffer中
res.append(strs[0].charAt(i));
}else{
//否则就退出
break;
}
}
//把这个StringBuffer转换为String返回去
return res.toString();
}
//提供给本类使用,所以,方法私有
//静态方法方便调用 返回值是boolean类型 传入一个字符串数组
//这是个检查函数
private static boolean checkStrs(String[] strs){
//定义一个标志
boolean flag=false;
//如果这个字符串数组是空的 我们就不做下面的事情
if(strs!=null){
//循环遍历
for(int i=0;i<strs.length;i++){
//这里是检查方法的核心
//如果这个字符串数组的每个元素不是空的并且长度不是0
//为什么有两个判断,元素为null不进入 元素的长度等于0不进入,只要一个不满足都不能进入
if(strs[i]!=null&&strs[i].length()!=0) {
flag = true;//检查通过可以对数组进行排序
}else {
flag=false;//检查不通过不能进行数据排序查找的工作
break;
}
}
}
return flag;//把这个值返回去
}
public static void main(String[] args) {
String[] strs={"Asbr","Assbre","Asbet"};
System.out.println(Main.longestCommonPrefix(strs));
}
}