最长公共前缀

最长公共前缀

问题描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

解题思路

1、逐个对比法,会略微比较麻烦,主要思想就是对每个字符串的每个位置进行逐个对比,方法比较容易理解。

class Solution {
    public String longestCommonPrefix(String[] strs) {
    	//这个问题需要排除两种特殊情况,为了代码的简洁性单独写了一个check函数对strs做检查
        if(!check(strs)){
            return "";
        }else{
        	//定义变量length来寻找字符串数组中最短的字符串长度,用作后续检验的依据
            int length = strs[0].toCharArray().length, temp, j;
            for(int i =0;i<strs.length-1; i++){
                temp = strs[i].toCharArray().length > strs[i+1].toCharArray().length ? strs[i+1].toCharArray().length:strs[i].toCharArray().length;
                length = length>=temp?temp:length;
            }
            //[i]是StringArray的位置,[j]是String分割后CharArray的位置,定[j]变[i]逐个位置对比,存在不同时跳出大循环      
            out:for(j = 0; j < length; j++){
                for(int i = 0; i< strs.length; i++){
                    if(!String.valueOf(strs[0].toCharArray()[j]).equals(String.valueOf(strs[i].toCharArray()[j]))){
                        break out;
                    }
                }
            }
            //利用substring方法切割strs[0]获取我们所需要的string  
            return (String)strs[0].substring(0, j);
        }
    }
    //自定义check函数,主要检验了空字符串{}和{""}两种特殊情况
    public boolean check(String[] strs){
        boolean result = true;
        if(strs.length == 0){
            result = false;
        }else{
            for(int i = 0; i< strs.length; i++){
                if(strs[i].equals("")){
                    result = false;
                }
            }
        }
        return result;
    }
}

2、利用string.startsWith()方法来匹配字符串前端,检查是否一致,不一致就将比对的字符串剪掉一位,继续对比。

class Solution {
    public String longestCommonPrefix(String[] strs) {
    	//排除一种特殊情况,即字符串数组里没有内容
        if(strs.length == 0) return "";
        //利用for循环对字符串数组里的字符串逐一判断
        for(String string : strs){
        	//用strs[0]和strs[i]进行比较,如果strs[0]不是strs[i]的前缀,就去掉strs[0]最后一位,一直去到strs[0]能作为strs[i]前缀为止
            while(!string.startsWith(strs[0])){
                if(strs[0].length() == 0) return "";
                strs[0] = strs[0].substring(0, strs[0].length() - 1);
            }
        }
        return strs[0];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值