【嘎】字符串-最长公共前缀

题目:编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""

解释: 输入不存在公共前缀。


说明:

所有输入只包含小写字母 a-z 。

又是很慢的写法 :(

 1 class Solution {
 2     public String longestCommonPrefix(String[] strs) {
 3         // 一开始没有判断
 4         if (strs == null || strs.length < 1) {
 5             return "";
 6         }
 7         if (strs.length == 1) {
 8             return strs[0];
 9         }
10         boolean hasFlag = false;
11         String initstr = strs[0];
12         for (int i = 1; i < strs.length; i++) {
13             String str1 = initstr;
14             String str2 = strs[i];
15             String temp = ""; // 这里不能去掉,每次循环的时候都要重新归零
16             int len = str1.length() > str2.length()? str2.length():str1.length();
17             // substring不包含第二个参数,一开始这里没有考虑到
18             for (int j = 1; j <= len; j++) {
19                 if (str1.substring(0, j).equals(str2.substring(0,j))) {
20                     hasFlag = true;
21                     temp = str1.substring(0, j);
22                 }
23             }
24             initstr = temp;
25             // 有相同的
26             if (hasFlag) {
27 
28             } else {
29                 return "";
30             }
31         }
32         return initstr;
33     }
34 }

本来想优化优化代码,然后越写越糟糕。。。后来发现写的每一步都减不了。。然后还是看看大佬的解答

 果然,我们不一样。。。突然想起当时看到题目想到了indexOf,然后就忘了

官方:

方法一:水平扫描法

 就是利用indexOf,将第一个作为prefix,然后当遍历1之后每个不是以他为头的就将prefix减少一位

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

看了这个代码,我发现我原先的7-9行是不需要的,在执行时间上没啥区别,但是也是冗余了~~

官方还有其他几种解法,下面是一位受官方启发写出来的

    public String longestCommonPrefix2(String[] strs) {
        if (strs.length == 0) {
            return "";
        }
        String ans = strs[0];
        for (int i = 1; i < strs.length; i++) {
            int j = 0;// 妙米生花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            for (; j < strs[i].length() && j < ans.length(); j++) {
                if (ans.charAt(j) != strs[i].charAt(j)) {
                    break;
                }
            }
            ans = ans.substring(0, j);

            if (ans.equals("")) {
                return ans;
            }
        }

        return ans;
    }
越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙
原文地址:https://www.cnblogs.com/utomboy/p/12426819.html