思路
比较简单。
Version1
自己写的,不多说了。
public static String longestCommonPrefix(String[] strs) {
String ret = "";
int i = 0, j = 0;
char c = strs[0].charAt(0);
while (true)
{
// 退出循环条件有2种
// 条件1 某一个字符串截止
// 条件2 某一个字符串有不相同的字符
boolean flag = false;
if (j < strs[0].length())
c = strs[0].charAt(j);
else
{
flag = true;
break;
}
for (i = 1; i < strs.length; i++)
{
if (j == strs[i].length() || strs[i].charAt(j) != c)
{
flag = true;
break;
}
}
if (flag)
break;
j++;
}
ret = strs[0].substring(0, j);
return ret;
}
Version2
借鉴解题思路,可以进一步理解递归。
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
} else {
return longestCommonPrefix(strs, 0, strs.length - 1);
}
}
public static String longestCommonPrefix(String[] strs, int start, int end) {
if (start == end) {
return strs[start]; // only one string in the array
} else {
int mid = (end - start) / 2 + start;
String lcpLeft = longestCommonPrefix(strs, start, mid); // 二分后的前一半 // 目的是得到最终返回的一个字符串
String lcpRight = longestCommonPrefix(strs, mid + 1, end); // 二分后的后一半
return commonPrefix(lcpLeft, lcpRight);
}
}
public static String commonPrefix(String lcpLeft, String lcpRight) {
int minLength = Math.min(lcpLeft.length(), lcpRight.length());
for (int i = 0; i < minLength; i++) {
if (lcpLeft.charAt(i) != lcpRight.charAt(i)) {
return lcpLeft.substring(0, i);
}
}
return lcpLeft.substring(0, minLength);
}