题意:找字符串数组的公共前缀字符串
参数:string[] 返回 string
思路:不断遍历循环所有的string,一位一位的比较,直到有不同为止,但是这样比不方便,所以,第一个string不参与循环,其他n-1个string循环,和第一个string的每一位比较。(string需要用toCharArray()变成字符数组)但是这种思路太复杂,显然是不好的,循环里面每个都还要比,实现起来是麻烦的。
然后就在纸上画:反推,假设公共子串是abc
那么比如:
a b c x y z
a b c d
a b c c c
a b c
a b c d d d t
我们来思考所谓最长前缀子串,分析它的充分必要的特征可以看出:从串的第一个开始,所有都有相同的部分,如果不是所有串那么可能会有更长的相同子串。比如上面只比较第二个和第五个就是a b c d。所以,我们继续思考,对于最长公共子串后面那一位,可能没有,可能有些相同(但是一定不是所有都相同),有些不同。所以比如是 x,d,c,' ',d这几个,先不用怎么分析,继续再列出极端临界情况:只有一个不同,其它都相同:c d d d d 或者全都不同a b c d e或者全为空。
好,现在来分析:关键在于可能会有相同的字母,但是不可能全=>存在不同 不严谨的描述最长公共子串后面那一位最核心的点就是:存在不同。
那么,接下来,怎么发现存在不同呢?我们只需要比较最大的和最小的就可以了!所以我们考虑对字符串排序。我们就可以只比较两个串!
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0)
return "";
Arrays.sort(strs);
char[] min = strs[0].toCharArray();
char[] max = strs[strs.length - 1].toCharArray();
int i = 0;
while(i < min.length && min[i] == max[i])
i++;
return strs[0].substring(0,i);
}
}