描述
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string “”.
Example 1:
Input: ["flower","flow","flight"]
Output: "fl"
Example 2:
Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.
Note:
All given inputs are in lowercase letters a-z.
难度
Easy
题目链接:
https://leetcode.com/problems/longest-common-prefix/
思路
就是找字符串数组的公共前缀,开始还以为找公共字符串,还以为突然从 Easy 跳到 Medium 了。如果寻找公共前缀的话问题就简单得多:
public static void main(String...args) {
System.out.println(longestCommonPrefix2(new String[]{"flower","flow","flight"}));
System.out.println(longestCommonPrefix2(new String[]{"racecdog","racecar","racccar"}));
System.out.println(longestCommonPrefix2(new String[]{"docarg","racecar","car"}));
System.out.println(longestCommonPrefix2(new String[]{"c","c"}));
System.out.println(longestCommonPrefix2(new String[]{"c"}));
System.out.println(longestCommonPrefix2(new String[]{"ca","c"}));
System.out.println(longestCommonPrefix2(new String[]{"ac","c"}));
}
private static String longestCommonPrefix2(String[] strs) {
if (strs.length == 0) return "";
if (strs.length == 1) return strs[0];
/* Find the shortest string. */
String search = strs[0];
for (int i=1; i<strs.length; i++) {
if (strs[i].length() < search.length()) {
search = strs[i];
}
}
/* Find common prefix from start. */
int i=0, len=search.length();
for (; i<len; i++) {
int k=0, size=strs.length;
for (; k<size; k++) {
if (strs[k].charAt(i) != search.charAt(i)) {
break;
}
}
if (k != size) return search.substring(0, i); /* Meet different char. */
}
if (i == len) return search; /* Full length is the common. */
return "";
}
这里先找出最短的字符串,然后从索引 0 开始进行遍历,仅此而已!
另外,寻找最长公共字符串(不是前缀)的话,可以参考下面的代码:
/**
* 返回的是最长公共字符串
*
* @param strs
* @return
*/
private static String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
if (strs.length == 1) return strs[0];
String search = strs[0].length() < strs[1].length() ? strs[0] : strs[1];
String another = strs[0].length() < strs[1].length() ? strs[1] : strs[0];
for (int i=0, len=search.length(); i<len; i++) {
for (int j=len; j>i; j--) {
String com = search.substring(i, j);
if (another.contains(com)) {
int k=2, size=strs.length;
for (; k<size; k++) {
if (!strs[k].contains(com)) {
break;
}
}
if (k == size) return com;
}
}
}
return "";
}