问题链接:https://oj.leetcode.com/problems/longest-common-prefix/
问题描述:Write a function to find the longest common prefix string amongst an array of strings.
API:public String longestCommonPrefix(String[] strs)
问题分析:这一题算法复杂度肯定是O(mn)跑不掉了,m是数组str的长度,不遍历完全部的字符串你怎么可能知道答案呢?那么说白了,这个问题只能尽可能缩小n的值,尽管这个值并不能成为一个常数或者对数。我想到的最优的方式就是n所有字符串中最短的长度min_len。因为longest-common-prefix的最大长度必然不会长于这个min_len而且必然在这个字符串中出现,否则要不就不common要不甚至就越界了。基于这个想法,给出算法代码:
1.先遍历一遍找出最短字符串。
2.然后将此字符串作为答案candidate跟所有其他字符串比较,并且维护最短的长度min_len,每次只对比前min_len个即可。
3.最后用substring(0,min_len)得到答案。
代码如下:
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0)
return new String();
int min_index = 0;
int min_len = Integer.MAX_VALUE;
for(int i = 0; i < strs.length; i++){
min_index = min_len > strs[i].length() ? i : min_index;
min_len = Math.min(min_len, strs[i].length());
}
for(int i = 0; i < strs.length; i++){
if(i == min_index)
continue;
for(int j = 0; j < min_len; j++){
if(strs[i].charAt(j) != strs[min_index].charAt(j)){
// strs[min_index] =strs[min_index].substring(0, j);
min_len = j;
}
}
}
return strs[min_index].substring(0,min_len);
}
说实话这题并没有取巧的方法,达到效率最高只能抠细节了。