题解 | #最长公共前缀#
最长公共前缀
http://www.nowcoder.com/practice/28eb3175488f4434a4a6207f6f484f47
public class Solution {
public static final String EMPTY = "";
/**
* @param strs string字符串一维数组
* @return string字符串
*/
public String longestCommonPrefix(String[] strs) {
// 参数检测
if (strs == null || strs.length == 0) {
return EMPTY;
}
if (strs.length == 1) {
return strs[0];
}
int length = strs.length;
// 开始遍历公共前缀
String coprefix = strs[0];
for (int i = 0; i < length - 1; i++) {
// 从头开始查找公共前缀
coprefix = findTwoWordsCommonPrefix(coprefix, strs[i + 1]);
if (isEmpty(coprefix)) {
// 没有公共前缀则返回空串
break;
}
}
return coprefix;
}
/**
* 判断是否是空字符串
*
* @param str 字符串
* @return boolean 是否是空字符串
*/
public boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
/**
* 查找两个单词的公共前缀
*
* @param str1 第一个字符串
* @param str2 第二个字符串
* @return string字符串 公共前缀
*/
public String findTwoWordsCommonPrefix(String str1, String str2) {
if (isEmpty(str1) || isEmpty(str2)) {
return EMPTY;
}
// 查找公共前缀
int minLen = str1.length() >= str2.length() ? str2.length() : str1.length();
// 遍历查找公共字符串
String coprefix = EMPTY;
for (int i = 0; i < minLen; i++) {
// 遍历查找公共前缀,每次往前查找一位
String prefix1 = str1.substring(0, i + 1);
if (str2.startsWith(prefix1)) {
// 是共同前缀则继续往前查找
// 缓存公共前缀
coprefix = prefix1;
continue;
} else {
// 是不共同前缀的话终止查找
break;
}
}
return coprefix;
}
}