014J Longest Common Prefix

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:

All given inputs are in lowercase letters a-z.

Method 1: 水平 (较优解,常规解)

  • 首先判断是否空

  • 不为空则先第一个和第二个 String 对比,如果 common prefix 不是从第二个 string 的头部开始, 那么 prefix 去掉尾部,继续比。循环,直到 prefix 是从第二个 string 的头部开始.此时得到的就是 1 和 2 字符串的共同 prefix.

  • 然后拿 12 的共同 prefix 继续和第 3 个比,以此类推。

  • 注意,一旦出现 prefix 为空,要立刻返回空。否则继续运行会报错。

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

Method 2 竖直方向 (最优解)

  • 竖直法首先还是排除空数组。

  • 竖直法取第一个词的第 i 个字母去和 其他词的第 i 个比较。如果相同就跳过。

  • 如果发现不同,那么就返回 substring(0,i),其实就是少返回一个字符。

  • 同时如果发现 i 等于字符串的长度。由于 i 是从 0 开始的,意味着此时 i 已经指向字符串末尾后一位不存在的 null 了。那么立刻返回 substring(0,i)。

  • 竖直法和水平法相比,其期望是更小的。

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

第二次竟然写出了几乎一样的代码;

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length < 1 || strs[0].length() < 1){
            return "";
        }
        int count = 0;
        for(int i = 0; i < strs[0].length();i++){
            char c = strs[0].charAt(i);
            for(String s : strs){
                if( i > s.length() - 1|| s.charAt(i) != c){
                    return strs[0].substring(0, count);
                }
            }
            count++;
        }

        return strs[0];
    }
}

Method 3 其实可以试试分治的方法

Last updated

Was this helpful?