题目
求字符串数组的最长公共子串
解决思路
这题算比较简单的了,思路有很多,下面我就提供一种思路。
既然要求字符串数组的最长公共子串,那么这个公共子串的长度肯定不大于最短的字符串数组,并且,这个公共子串,不仅字符是一样的,而且索引位置也必须一样(LeetCode上是这么理解的,我在做这题的时候也没有意识到这点)所以,我们可以先找到最短的字符串,然后以这个最短的字符串为标准,那么就很容易求出最大的公共子串。
下面则是该思路的Java程序:
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0)
return "";
// 1.求数组中最短的字符串
int minlen = strs[0].length();
int minIndex = 0;
for(int i = 0;i < strs.length;i++){
if(minlen > strs[i].length()) {
minlen = strs[i].length();
minIndex = i;
}
}
if(minlen == 0)
return "";
// 2.求公共的字符串
StringBuffer sb = new StringBuffer();
int index = 0;
while(index < minlen) {
sb.append(strs[minIndex].charAt(index));
for (int k = 0; k < strs.length; k++) {
if (!strs[k].startsWith(sb.toString())) {
if(index == 0)
return "";
else{
sb.deleteCharAt(sb.length()-1);//由于最后一个不包含在公共子串中,所以需要删除
return sb.toString();
}
}
}
index++;
}
return sb.toString();
}
由程序可以看出,该算法的时间复杂度最大为 O(n2) ,空间复杂度为 O(1) 。