oj14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

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

思路:英语不太好,题意一开始没有理解清楚,错误理解为找出字符串数组中最大的共同前缀,即只要有任意两个满足条件即可,代码如下,由于无法提交进行所有测试,所以代码肯定有错。

public String longestCommonPrefix(String[] strs) {
       int strs_len = strs.length;
       StringBuilder sb = new StringBuilder("");
       int max_len = 0;
       for(int i = 0;i<strs_len-1;i++){
           char[] a = strs[i].toCharArray();
           for(int j = i+1;j<strs_len;j++){
               char[] b = strs[j].toCharArray();
               int temp_len = 0;
               for(int k =0; k<Math.min(a.length,b.length);k++){
                   if(a[k] == b[k]){
                       temp_len++;
                   }else{
                       break;
                   }
               }
               if(temp_len>max_len){
                   max_len = temp_len;
                   sb.setLength(0);
                   sb.append(strs[i].substring(0,max_len));
               }
           }
       }
        return sb.toString();
    }

提交后发现必须字符串数组中的所有字符串都满足前缀相同的条件,这一来要比原来的问题简单一些,思路为先找到数组中长度最短的字符串并存储其长度,之后以最短字符串为基准,从头开始依次比较所有字符串的字符,若所有字符串相同下标的字符都相等,则计数加一,否则截取字符串并返回。

public String longestCommonPrefix(String[] strs) {
       int strs_len = strs.length;
       if(strs_len == 0){
           return "";
       }
       int max_len = 0;
       int min_str = 0;
       int min_str_len = strs[0].length();
       /*先找到数组中长度最短的字符串并存储其长度*/
       for(int i = 0;i<strs_len;i++){
           if(strs[i].length() < min_str_len){
               min_str_len = strs[i].length();
               min_str = i;
           }
       }
       /*以最短字符串为基准,从头开始依次比较所有字符串的字符,若所有字符串相同下标的字符都相等,则计数加一,否则截取字符串并返回*/
       for(int i = 0;i<min_str_len;i++){
           char a = strs[min_str].charAt(i);
           for(int j = 0;j<strs_len;j++){
               char b = strs[j].charAt(i);
               if(b != a) {
                  return strs[min_str].substring(0,max_len);
               }
            }
            max_len++;
       }
       return strs[min_str].substring(0,max_len);
    }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值