【一次过】Lintcode 78. 最长公共前缀

给k个字符串,求出他们的最长公共前缀(LCP)

样例

在 "ABCD" "ABEF" 和 "ACEF" 中,  LCP 为 "A"

在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"


解题思路1:

两两比较得出临时前缀结果,再用这个结果去比较下一个字符串得出又一个前缀结果,直到比较完所有字符串,这个前缀结果即为最终结果。

public class Solution {
    /**
     * @param strs: A list of strings
     * @return: The longest common prefix
     */
    public String longestCommonPrefix(String[] strs) {
        StringBuilder sb = new StringBuilder();
        
        int p = 0;  //指向字符串中的字符位置
        int times = 0;  //当前字符存在于多少str中
        Character c = null; //strs[i].charAt(p)
        
        for(int i=0; i<strs.length && p<strs[i].length(); i++){
            if(i == 0){                         //首字符
                c = strs[i].charAt(p);
                times++;
            }else if(c == strs[i].charAt(p))    //相等则继续遍历     
                times++;
            else                                //不等则退出
                break;
            
            if(times == strs.length){           //若相同字符次数==strs长度,表明为公共前缀
                sb.append(c);
                times = 0;
                p++;
                i = -1;
            }
        }
        
        return sb.toString();
    }
}

解题思路2:

以第一个字符串为参照,固定列,逐行对比,找出最大前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0)
            return "";
        int length = strs[0].length();  //列
        int wide = strs.length;         //行

        for(int i=0; i<length; i++){
            char c = strs[0].charAt(i);
            for(int j=1; j<wide; j++){
                if(i >= strs[j].length() || strs[j].charAt(i) != c)
                    return strs[0].substring(0, i);
            }
        }

        return strs[0];
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值