Leetcode 14 : Longest Common Prefix

37 篇文章 0 订阅
26 篇文章 0 订阅

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

分析:
一个字符数组的最长公共前序。例如”abcdsa”,”a”,”abcjd”的公共前序就是”a”,不难见得,最长公共前序是由最短的字符串来决定的,那么可以如下的一种思路:
1.求得前两个字符串的公共前序,存为ans
2.如果字符串数组中的字符串的长度小于ans的长度,则进行比对,求得新的公共前序ans,否则不进行比较。
也就是说,例如,“abcdefg”,”abcd”,”abcdef”,”abc”
“abcdefg”与”abcd”的公共前序为”abcd”,记为ans
ans的长度为4,那么ans与字符串”abcdef”比较时,由于字符串”abcdef”的长度为5,而ans的长度为4(最长公共前序是由最短的字符串来决定的),所以不需要进行比较,直接与下一个字符串”abc”进行比较,由于字符串”abc”的长度小于ans(”abcd”),则一次进行比对,求得新的公共前序,并存为ans。

有如下代码(未优化,并未AC,超时):

public class LongestCommonPrefix {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length<=0 || strs==null)
           return " ";
        String ans = strs[0];
        if(strs.length==1)
          return ans;
        int i,j ;
        for(i=1 ; i<strs.length;i++){
             if(ans.length()>strs[i].length()){ //公共前序的长度大于字符串的长度时,需要进行比对,求得新的公共前序
                 for(j=0;j<strs[i].length();++j){ //逐一比对
                     if(strs[i].charAt(j)!=ans.charAt(j)) //发现不想同的字符则停止
                           break;
                 }
                 //新的公共前序
                 ans = String.valueOf(strs[i].subSequence(0,j));
             }
         }
         return ans;
    }
  }

AC代码:
这种方法空间时间复杂度很小

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0 || strs == null)
          return "";
        for(int i=0;i<strs[0].length();i++){
            char x = strs[0].charAt(i);
            for(int j=1;j<strs.length;j++){
                if(strs[j].length()==i || strs[j].charAt(i)!=x)
                   return strs[0].substring(0,i);

            }

        }
        return strs[0];
    }
}

参考:
http://www.cnblogs.com/springfor/p/3872316.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值