最长公共前缀的巧妙求解

求出一个字符串数组的最长公共前缀

//编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串

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));
    }
}

总结:重点在数组排序的实用类的方法,减少比较次数,简化比较方法。多读几遍收获就会不一样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值