这道题目的解法非常值得借鉴,一开始的思路是先用str[0]开始,逐个增加pre,并且分别检查其他的string是否含有pre作为开头。但是这道题目是首先把pre设置为str[0],并且依次向后检测其他的string是否含有这个pre作为开头,如果没有的话那么就使用String的substring method将pre的长度减一,然后再进行检测。最差的情况下时间复杂度为O(S),其中S为所有string的长度的和,最差的情况在所有的字符串都相等的时候达到,空间复杂度为O(1),代码如下:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0) return ""; // corner case
String pre = strs[0];
for(int i = 1; i < strs.length; i++){
// Reduce pre until have sth in common
while(strs[i].indexOf(pre) != 0){
pre = pre.substring(0, pre.length() - 1);
if(pre.isEmpty()) return "";
}
}
return pre;
}
}
这道题目在LeetCode的article版有非常全面的解释,链接在此:https://leetcode.com/articles/longest-common-prefix/#approach-1-horizontal-scanning
知识点:
1. 注意这里判断某个string是否为另一个string的prefix的方法是s.indexOf(pre) == 0,而不是s.indexOf(pre) != -1,后者是判断pre是否在string中的方法
2. String的一些常用的method要记下: isEmpty(), length(), indexOf(), substring(), 注意substring使用两个参数的时候不包括后面的参数