解法剖析

来自leetcode

具体的内容我就不复制粘贴了,只讲一下我对每种解法的理解

Horizontal scanning

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 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;
}

这种方法之所以能够如此简洁得益于**indexOf()**方法

  • public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

  • public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

  • int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

  • int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

indexOf()方法能够返回指定字符在字符串中第一次出现的位置,即出现了就为0,未出现就为-1。

解析

1
2
3
4
5
6
7
// 当在strs[i]后面字符串中找不到公共子串时
while (strs[i].indexOf(prefix) != 0) {
	// prefix 长度减一位,前面的比较仍然是成立的,因为减过长度的字符串是原来字符串的子集
    prefix = prefix.substring(0, prefix.length() - 1);
	// prefix为空返回""
    if (prefix.isEmpty()) return "";
}

Vertical scanning

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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];
}

解析

这个解题的思路与我用Python实现的解题思路是一致的,只不过java提供的处理字符串的方法是真的好用实现起来也很简单。

后面的方法可以作为了解。