题目
- 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解析
- 我们使用了两种方法进行解析,但是都是水平解析的
(1)每一个单词都去比较,以第一个单词为基准,找到和第一个单词的最长公共子串,之后再用找到的最长的公共子串和之后的单词进行比对
(2)按列进行对比,以第一个单词为准,遍历第一个单词,观察每一个列是否都在后面的单词中能够找到
代码如下
/**
* 水平扫描,每次扫描对比一个字符串和上一个重复的字符前缀
* @param strs
* @return
*/
public String longestCommonPrefix_1(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
// 以第一个单词为基准
String words = strs[0];
// 最后的返回结果设置为空
String result = "";
// 从下一个单词开始进行遍历
for (int i = 1; i < strs.length; i++) {
String tmp = strs[i];
int j = 0;
// 判断是否有重复的字符
while (j < words.length() && j < tmp.length() && words.charAt(j) == tmp.charAt(j)) {
// 如果有重复的字符,将其保存
result = result + tmp.charAt(j);
j ++;
}
// 如果本次的对比没有找到重复的字符,直接返回,表示没有最大重复子串前缀
if (result.isEmpty()) {
return "";
}
// 下一次比较应该和这个重复的字符进行比较,而不是在和数组中单词做比较
words = result;
// 将这一次的重复字符赋值为空
result = "";
}
return words;
}
/**
* 水平扫描
* 我们每次按列对比(以第一字符串为基准),一列一列的进行比较
* @param strs
* @return
*/
public String longestCommonPrefix_2(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
String result = "";
// 用来判断是否已经有字符串不满足公共子串了
boolean flag = false;
// 以第一个单词为基准进行列的遍历
for (int i = 0; i < strs[0].length(); i++) {
// 如果当前已经有不满足公共子串
if (flag) {
return result;
}
// 当前遍历的字符
char c = strs[0].charAt(i);
// 遍历第一个单词之后的单词,看是否有这个列
for (int j = 1; j < strs.length; j++) {
if (i < strs[j].length() && c == strs[j].charAt(i)) {
if (j == strs.length - 1) {
result += c;
}
} else {
// 表示已经有单词不满足这个列了退出
flag = true;
break;
}
}
}
return result;
}