0
点赞
收藏
分享

微信扫一扫

一个String数组,请找出数组中字符串的最长公共前缀

初次看到的时候有点懵,一点头绪都没有。根本就没有仔细读题,什么是最长公共前缀呢?

   比如现在有一个String数组,我们需要找到这个数组包含的String字符串中包含的最长公共前缀。还是很绕,举个例子我们就知道了。

一个String数组,请找出数组中字符串的最长公共前缀_最长公共前缀

   

/*编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
输入: ["flower","flow","flight"]输出: "fl" */

分析下: 其实我们就是需要找到 "flower","flow"和"flight"中都包含的前缀字符串。先不考虑数组为空、字符串为空的情况,直接从头开始判断。

public static void main(String[] args){

    String str1 = "flower";

    String str2 = "flow";

    String str3 = "flight";

    //然后想到,这个最长的公共前缀,肯定比最短的String字符串还要短

    //字符串1、2、3中前缀就是每个字符串对应的字符,需要都一样

   //我们来用个最笨的方法

    String str4; //这个就是最长的公共前缀

    for (int i = 0; i < str2.lengthj;i++){  //以最短的字符串长度为上限

        if(str1[i] == str2[i] && str2[i] == str3[i] ){ //笨办法,n个字符都相等

              str4 = str4 + str1[i];

}

     System.out.println(str4);
           

}

}

}     


这样得出的结果为 "fl"

但是这个程序有很有漏洞,也就是测试说的bug

  1. 如果传入的数组或者数组包含的String字符串为空,怎么处理
  2. 你怎么知道哪个字符串最短呢?是不是需要判断下?
  3. 代码显得很笨重


下面我们再来分析下代码对应的bug

  1. 如果为空,则返回" " (空)就可以
  2. 使用一个方法,对数组中相邻的String字符串都进行长度比较

    3.代码的优化


public class LongestCommonPrefix {


/*假设有一个最长的公共字符串,有什么特点呢 1.这个字符串在n个字符串中都有 2。而且是最长的 */
public String LongestCommonPrefix(String[] strs){
if (strs == null || strs.length == 0){ //如果数组为空或者数组的长度为空,直接返回最长公共字符串为空 return " "; }
String prefix = strs[0]; //String数组中的第一个字符串 int count = strs.length; //数组的长度 for (int i = 1; i < count ; i++) { //找最长公共前缀开始 prefix = LongestCommonPrefix(prefix,strs[i]); if (prefix.length() == 0){
break; }
}

System.out.println(prefix); return prefix; }

public String LongestCommonPrefix(String str1,String str2) { //两个String参数 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 void main(String[] args) {
String[] args1 = {"flower","flow","flight"}; String[] args2 = {"cool","qwertfolasxxx","1234ol000"}; LongestCommonPrefix lcp = new LongestCommonPrefix(); //lcp.LongestCommonPrefix(args1); lcp.LongestCommonPrefix(args2); }



}

首先,我们先判断了数组为空或者数组中字符串为空的情况,接着我们用一个方法比较相邻字符串的长度

但是这样看还是很冗余,还有没有更好的方法呢。来看看这个


class Solution {
    public String longestCommonPrefix(String[] strs) {
       String pre = "";
       for (String str : strs) {
           pre = str.length() > pre.length() ? str : pre;
       }
       for (int i = 0; i < strs.length; i++) {
           String curStr = strs[i];
           int j;
           for (j = 0; j < curStr.length() && j < pre.length(); j++) {
               if (pre.charAt(j) != curStr.charAt(j)) {
                   break;
               }
           }
           if (j <= 0) {
               return "";
           }
           pre = curStr.substring(0, j);
       }
       
       return pre;
    }
}


这个看着就更简洁了,但是有点复杂,容易把人绕晕了。

看看你合适哪个方法


举报

相关推荐

0 条评论