最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
先上个人思路和代码
public class Test14 {
/**
* 题目14: 最长公共前缀
* 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回""
*/
public static void main(String[] args) {
// 思路:先第一组比,得出一个正确的字符串数组
// 后以结果数组与下一个元素比较
// 以此往复,直到返回空字符串或遍历完数组
String [] data = new String[] {"abc","abcass","abcaww"};
String result = solution(data);
System.out.println(result);
}
public static String solution(String[] data) {
if (data.length < 1) {
return "";
}
if (data.length == 1) {
return data[0];
}
String temp = "";
for (String datum : data) {
if ("".equals(temp)) {
temp = datum;
} else {
char[] chars = temp.toCharArray();
char[] chars1 = datum.toCharArray();
// 取两个数组中长度最小的值,来遍历
int size = Math.min(chars.length, chars1.length);
char[] result = new char[size];
for (int i = 0; i < size; i++) {
if (chars[i] == chars1[i]) {
result[i] = chars[i];
} else {
break;
}
}
temp = String.valueOf(result);
}
}
return temp;
}
}
我的思路很简单,比最长公共前缀,实际比较的方法就是,String.toCharArray()转成char数组,依次比较。
其中的思路:取一个字符串做temp,每一次比较将结果记录下来。这样时间复杂度就是O(n),n是字符串数组长度。同时,在遍历的时候,如果temp结果在初始化后,又为空,那就可以认为公共前缀已经是空字符串了。
然后,我们到Leetcode上跑下。。。。
很好,报错了。。。
我透。。。
经过调试修改,先看下修改后正确的代码:
public static String solution(String[] data) {
if (data.length < 1) {
return "";
}
if (data.length == 1) {
return data[0];
}
String temp = "";
boolean flag = false;
for (int i = 0; i < data.length && !flag; i++) {
String datum = data[i];
if ("".equals(temp) && i == 0 && !"".equals(datum)) {
temp = datum;
} else {
char[] chars = temp.toCharArray();
char[] chars1 = datum.toCharArray();
int size = Math.min(chars.length, chars1.length);
char[] result = new char[size];
for (int j = 0; j < size; j++) {
if (chars[j] == chars1[j]) {
result[j] = chars[j];
} else {
if ("".equals(temp)) {
flag = true;
}
break;
}
}
temp = String.valueOf(result).trim();
}
}
return temp;
}
注意:刚开始的代码,错了大致三个地方
- break只会跳出当前循环,我没有考虑到当temp已经为"",需要跳出整个循环
- temp = datum时,需要判断下是否是初始化状态,字符串数组中是否含有""的情况
- 我用的是char数组作为temp,初始化时按最小的char长度初始化。这个时候,如果直接String.valueOf转。在本地看不出来,在leetcode上会出现/U00000空格的情况。所以需要加trim去空格