题目
求字符串数组的最长公共子串
解决思路
这题算比较简单的了,思路有很多,下面我就提供一种思路。
既然要求字符串数组的最长公共子串,那么这个公共子串的长度肯定不大于最短的字符串数组,并且,这个公共子串,不仅字符是一样的,而且索引位置也必须一样(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) 。
