编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
思路:这题思路不难,但在具体的实现中有一些坑,自己最开始用c++写但是有一些内存之类的问题,就换成java了,c++基础还得好好学,不然知道怎么做但是不会改就很痛苦了,后来参考了题解发现竟然还有这么多中解法,感觉刷题质量更重要不能提交结束就算了,题解和评论一定要看。具体的思路题解上都有我这就不多说了,题解链接https://leetcode-cn.com/problems/longest-common-prefix/solution/
/*
* 编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
*
* */
public class 最长公共前缀_14 {
/*水平扫描法-1*/
public static String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++)
{
//返回指定字符在字符串中第一次出现的索引,没有则返回-1
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
/*水平扫描-2*/
public static String longestCommonPrefix1(String[] strs) {
if (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];
}
/*分治法*/
public static String longestCommonPrefix2(String[] strs){
if (strs == null || strs.length == 0) return "";
return longestCommonPrefix2(strs, 0, strs.length - 1);
}
public static String longestCommonPrefix2(String[] strs, int l, int r) {
if (l == r) return strs[l];
else {
int mid = (l+r)/2;
String lcpleft = longestCommonPrefix2(strs, l, mid);
String lcpright = longestCommonPrefix2(strs, mid+1, r);
return CommonPrefix2(lcpleft, lcpright);
}
}
public static String CommonPrefix2(String left, String right) {
int min = Math.min(left.length(), right.length());
for (int j = 0; j < min; j++) {
if (left.charAt(j) != right.charAt(j)) {
return left.substring(0, j);
}
}
return left.substring(0, min);
}
/*二分法*/
public static String longestCommonPrefix3(String[] strs) {
if (strs == null || strs.length == 0) return "";
int minLen = Integer.MAX_VALUE;
for (String str : strs) {
minLen = Math.min(minLen, str.length());
}
int low = 1;
int high = minLen;
while (low < high) {
int mindle = (low + minLen) / 2;
if (isCommonPrefix(strs, mindle)) {
low = mindle + 1;
}
else {
high = mindle - 1;
}
}
return strs[0].substring(0, (low + high) / 2);
}
private static boolean isCommonPrefix(String[] strs, int len) {
String str1 = strs[0].substring(0, len);
for (int i = 1; i < strs.length; i++) {
if (!strs[i].startsWith(str1)) return false;
}
return true;
}
public static void main(String[] args) {
String[] strs = {"flower","flow","flight"};
/*算法1*/
String result = longestCommonPrefix(strs);
System.out.println(result);
/*算法2*/
String result1 = longestCommonPrefix1(strs);
System.out.println(result1);
/*算法3*/
String result2 = longestCommonPrefix2(strs);
System.out.println(result2);
/*算法4*/
String result3 = longestCommonPrefix2(strs);
System.out.println(result3);
}
}