题目 |
编写一个函数来查找字符串数组中最长的公共前缀字符串
例子:字符串数组:leets leetcode leet leeds
公共前缀字符串就是Lee
思路1 |
1.拿第一个和第二个对比,找到最长的,也就是leet
2.在和下一个比较,如果还是leet,则比较下一个字符串;如果不是leet,则去掉最后一位,得到lee,再进行比较
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++)
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
return prefix;
}
这个思路学习两点:
1.将第一个字符串整个当做一个前缀去和第二个字符串进行比较,而不是一位一位去比较
2.使用strs[i].indexof(prefix)是否等于零来作为判断前缀的依据,很巧妙
思路2 |
1.纵向比较,取出第一个字符串的第一个字母,和后三个字符串的第一个进行比较,如果都相等,则开始比较第二个字母,直到出现不相等的情况
2.感觉这种比较方法,好像是有一个滑动的游标,在进行移动,移动到不符合条件的时候,将零到游标之间的字符截取下来,就是我们要的值
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
for (int i = 0; i < strs[0].length() ; i++){
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j ++) {
if (i == strs[j].length() || strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0];
}
思路3——分而治之 |
思路:一分为二,分别去找最长的前缀,然后在两个前缀中找到最后答案
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
return longestCommonPrefix(strs, 0 , strs.length - 1);
}
private static String longestCommonPrefix(String[] strs, int l, int r) {
if (l == r) {
return strs[l];
}
else {
int mid = (l + r)/2;
String lcpLeft = longestCommonPrefix(strs, l , mid);
String lcpRight = longestCommonPrefix(strs, mid + 1,r);
return commonPrefix(lcpLeft, lcpRight);
}
}
static String commonPrefix(String left,String right) {
int min = Math.min(left.length(), right.length());
for (int i = 0; i < min; i++) {
if ( left.charAt(i) != right.charAt(i) )
return left.substring(0, i);
}
return left.substring(0, min);
}
最后一个代码要好好在理解一下,先在这里记录下来