• LeetCode第[14]题(Java): Longest Common Prefix


    题目:最长公共前缀

    难度:EASY

    题目内容

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

    If there is no common prefix, return an empty string "".

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

    如果没有公共前缀,则返回空字符串。

    Example 1:

    Input: ["flower","flow","flight"]
    Output: "fl"
    

    Example 2:

    Input: ["dog","racecar","car"]
    Output: ""
    Explanation: There is no common prefix among the input strings.
    

    Note:

    所有输入都是小写字母a-z。

    我的思路:最简单的方法对String[]中最短的那一个长度进行遍历,在遍历中取String[]中每一个的当前位置字符与下一个比较,一旦不一样就返回结果。

         还有一种就是,用Set,在内部遍历中用set将String[]中每一个的当前位置字符放入,出来的时候判断size()是否==1,好吧这种空间复杂度更高,显得更蠢。。

     1     public String longestCommonPrefix(String[] strs) {
     2         if (strs.length < 1) {
     3             return "";
     4         }
     5         
     6         int minlen = Integer.MAX_VALUE;
     7         for (int i = 0;i < strs.length; i++) {
     8             if (strs[i].length() < minlen) {
     9                 minlen = strs[i].length();
    10             }
    11         } // 获得最短长度minLen
    12         
    13         
    14         StringBuffer sb = new StringBuffer();
    15         for (int j = 0; j < minlen; j++) {
    16             for (int i = 0; i< strs.length - 1; i++) {
    17                 if (strs[i].charAt(j) != strs[i+1].charAt(j)) {
    18                     return sb.toString();
    19                 }
    20             }
    21             sb.append(strs[0].charAt(j));
    22         }
    23         return sb.toString();
    24     }

    我的时间复杂度:  O(N*M)   N为字符串个数,M最短字符串长度

    编码过程问题
    1、一开始直接拿strs[0]的长度做的循环,导致测试用例{aa,a}越界,写了minLen后通过

    2、minLen的初值一开始写成了MIN_VALUE.

    参考答案Code:

    1     public String longestCommonPrefix(String[] strs) {
    2         if (strs == null || strs.length == 0)
    3             return "";
    4         String pre = strs[0];
    5         for (int i = 1; i < strs.length; i++)
    6             while (strs[i].indexOf(pre) != 0) 
    7                 pre = pre.substring(0, pre.length()-1);
    8         return pre;
    9     }

    9行! 厉害了,。。

    答案复杂度:O(N*M)   虽然复杂度看起来一样,但是其实每次while循环并没有循环M次,也少了取minLen的操作

    答案思路:取任意一个字符串做初始前缀,然后对后面每一个进行while循环:如果当前的前缀 与你进行字符串匹配的结果不是0【是0则是前缀,null,和其他字符都不行】,则把pre的最后一个字符去掉,再匹配,直到为0.

    由于是取大家最长的公共前缀,所以也就类似于木桶短板效应,最后的值会是那个最短的,所以把pre保存给下一个再进行while循环。

  • 相关阅读:
    UVa11218 KTV
    counting sort 计数排序
    Uva10474
    Uva110 Meta-Loopless Sorts
    Uva592 Island of Logic
    Qtwebkit flashplayer插件问题
    C++程序员的javascript教程
    Binary Search
    排列组合生成算法
    【Linux】mkdir命令
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/8904153.html
Copyright © 2020-2023  润新知