【LeetCode Easy】014 Longest Common Prefix

Easy 014 Longest Common Prefix

Description:

find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string “”. (注意要检查参数数组是否为空或==null)
Example
Input: [“flower”,“flow”,“flight”]
Output: “fl”

My Solution:
  • for循环找出数组中最短的那个单词,以这个单词为基准,两层for循环嵌套,外层for是遍历这个最短单词的每一个字母,内层for是遍历所有单词,看其它单词这个位置的字母是否和最短单词一样,若都一样,继续向下遍历,若有不一样的,break,返回当前的最长前缀

  • 时间复杂度O(n²)

  • 代码如下:

  •  public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0)
            return "";
        String shortest = strs[0];
        String prefix = "";
        for(int i=1; i<strs.length; i++){
            if(strs[i].length() < shortest.length())
                shortest = strs[i];
        }
    
        for(int i=0; i<shortest.length(); i++){
            int j = 0;
            for(; j<strs.length; j++){
                if(strs[j].charAt(i) != shortest.charAt(i))
                    break;
                if(j == strs.length-1)
                    prefix += String.valueOf(shortest.charAt(i));
            }
            if(j != strs.length)
                break;
        }
        return prefix;
    }
    
  • 仍旧是先找出最短字符串,以该字符串为基准,看其它字符串是否startswith该字符串,如果有不符合的,就减去最短字符串的最后一个字母然后继续遍历其它字符串,直至所有字符串都startswith某个前缀或最短字符串被减为空串

  • 最坏情况下时间复杂度是O((shortest.length()-1) * n),这个最坏情况可能会好于第一种方法

  • 这个方法的时间已经非常短了,但有一点比较疑惑的是这个方法的空间复杂度比法一要高一点(挠头

  • (部分)代码如下:

       while (!shortest.equals("")){
           int j = 0;
           for (; j<strs.length; j++){
               if (!strs[j].startsWith(shortest)){
                   shortest = shortest.substring(0,shortest.length()-1);
                   break;
               }
           }
           if (j == strs.length)  //这里这个if如果忘写了就会死循环
               return shortest;
       }
       return shortest;
Fast Solution
  1. 对My Solution的法二做一个改进,不需要找出最短字符串,直接用第一个字符串为基准就可以做了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值