初次看到的时候有点懵,一点头绪都没有。根本就没有仔细读题,什么是最长公共前缀呢?
比如现在有一个String数组,我们需要找到这个数组包含的String字符串中包含的最长公共前缀。还是很绕,举个例子我们就知道了。
/*编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
输入: ["flower","flow","flight"]输出: "fl" */
分析下: 其实我们就是需要找到 "flower","flow"和"flight"中都包含的前缀字符串。先不考虑数组为空、字符串为空的情况,直接从头开始判断。
public static void main(String[] args){
String str1 = "flower";
String str2 = "flow";
String str3 = "flight";
//然后想到,这个最长的公共前缀,肯定比最短的String字符串还要短
//字符串1、2、3中前缀就是每个字符串对应的字符,需要都一样
//我们来用个最笨的方法
String str4; //这个就是最长的公共前缀
for (int i = 0; i < str2.lengthj;i++){ //以最短的字符串长度为上限
if(str1[i] == str2[i] && str2[i] == str3[i] ){ //笨办法,n个字符都相等
str4 = str4 + str1[i];
}
System.out.println(str4);
}
}
}
这样得出的结果为 "fl"
但是这个程序有很有漏洞,也就是测试说的bug
- 如果传入的数组或者数组包含的String字符串为空,怎么处理
- 你怎么知道哪个字符串最短呢?是不是需要判断下?
- 代码显得很笨重
下面我们再来分析下代码对应的bug
- 如果为空,则返回" " (空)就可以
- 使用一个方法,对数组中相邻的String字符串都进行长度比较
3.代码的优化
public class LongestCommonPrefix {
/*假设有一个最长的公共字符串,有什么特点呢 1.这个字符串在n个字符串中都有 2。而且是最长的 */
public String LongestCommonPrefix(String[] strs){
if (strs == null || strs.length == 0){ //如果数组为空或者数组的长度为空,直接返回最长公共字符串为空 return " "; }
String prefix = strs[0]; //String数组中的第一个字符串 int count = strs.length; //数组的长度 for (int i = 1; i < count ; i++) { //找最长公共前缀开始 prefix = LongestCommonPrefix(prefix,strs[i]); if (prefix.length() == 0){
break; }
}
System.out.println(prefix); return prefix; }
public String LongestCommonPrefix(String str1,String str2) { //两个String参数 int length = Math.min(str1.length(),str2.length()); //取两个字符串长度的小值 int index = 0; while (index < length && str1.charAt(index) == str2.charAt(index)){
index++; }
return str1.substring(0,index); }
public static void main(String[] args) {
String[] args1 = {"flower","flow","flight"}; String[] args2 = {"cool","qwertfolasxxx","1234ol000"}; LongestCommonPrefix lcp = new LongestCommonPrefix(); //lcp.LongestCommonPrefix(args1); lcp.LongestCommonPrefix(args2); }
}
首先,我们先判断了数组为空或者数组中字符串为空的情况,接着我们用一个方法比较相邻字符串的长度
但是这样看还是很冗余,还有没有更好的方法呢。来看看这个
class Solution {
public String longestCommonPrefix(String[] strs) {
String pre = "";
for (String str : strs) {
pre = str.length() > pre.length() ? str : pre;
}
for (int i = 0; i < strs.length; i++) {
String curStr = strs[i];
int j;
for (j = 0; j < curStr.length() && j < pre.length(); j++) {
if (pre.charAt(j) != curStr.charAt(j)) {
break;
}
}
if (j <= 0) {
return "";
}
pre = curStr.substring(0, j);
}
return pre;
}
}
这个看着就更简洁了,但是有点复杂,容易把人绕晕了。
看看你合适哪个方法