LeetCode —— 14. Longest Common Prefix解题思路

题目:Write a function to find the longest common prefix string amongst an array of strings.(写一个函数,找出字符串数组中最长公共前缀)

思路:(我是基于正向考虑的,即从最长公共前缀的第一个字符开始匹配,直到最长公共前缀的最后一个字符为止)先处理两种特殊情况:

1.如果需要判断的字符串集合strs为空,则直接返回结果“”;

2.如果需要判断的字符串集合strs中只要一个元素,则最长公共前缀即为该元素本身,直接返回该元素即可;

一般情况:

先遍历一遍字符串数组strs,找到最短的一个字符串shortestStr,以此为判断标准。每次取shortestStr的一个字串对字符串集合strs中的其它字符串进行前缀匹配,若匹配成功,则该字串为最长公共前缀的一部分,然后使字串在原来的基础上长度增加一,继续进行新一轮的匹配,直到字串等于shortestStr本身为止,否则匹配失败。输出“”;


代码如下:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0)    return "";
        if(strs.length == 1)    return strs[0];
        String shortestStr = strs[0];
        String ans = "";
        int i, shortestStrIndex = 0;
        for(i = 1; i < strs.length; i++) {
            if(shortestStr.length() > strs[i].length()) {
                shortestStr = strs[i];
            }
        }
        while(shortestStrIndex < shortestStr.length()) {
            for(i = 0; i < strs.length; i++) {
                if(strs[i].indexOf(shortestStr.substring(0, shortestStrIndex+1)) < 0)
                    break;
                else if(!strs[i].substring(0, shortestStrIndex+1).equals(shortestStr.substring(0, shortestStrIndex+1)))
                    break;
            }
            if(i == strs.length)
                ans = shortestStr.substring(0, shortestStrIndex+1);
            shortestStrIndex++;
        }
        return ans;
    }
}


Ps:提交代码之后,通过了。但是运行时间略长,看了一下运行时间最短的代码,才发现第一步没必要找出最短的字符串,因为最长公共前缀是固定的啊。。。这一步操作多余了。参考下面给出LeetCode 记录中最短运行时间的代码,可以发现,这题要是从逆向出发,直接考虑最长公共前缀,则要简单的多。


class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs==null || strs.length==0) return "";
        String prefix = strs[0];
        int i=1;
        while(i<strs.length){
            while(strs[i].indexOf(prefix)!=0)
                prefix = prefix.substring(0,prefix.length()-1);
            i++;
        }
        return prefix;
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值