14. 最长公共前缀
1、题目要求
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例
示例1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
2、代码思路
纵向比较
将 strs[0]
作为标兵,依次将 str[j].charAt(i)
与 strs[0].charAt(i)
相比较
- 如果
str[j].charAt(i) != strs[0].charAt(i)
,则说明这一列有不同的字符啦,就应该终止最长公共前缀的匹配,此时最长公共前缀为strs[0].substring(0, i)
- 还有一种情况肯定得考虑,如果
str[j]
的长度小于str[0]
的长度,执行str[j].charAt(i)
操作肯定会出现StringIndexOutOfBoundException
,因为i
是从0
累加上来的,所以可以这样判断:如果i >= str[j].length()
(严格来讲应该写成i == str[j].length()
),就应该终止最长公共前缀的匹配,此时最长公共前缀为strs[0].substring(0, str[j].length())
,即最长公共前缀为strs[0].substring(0, i)
3、代码实现
class Solution {
public String longestCommonPrefix(String[] strs) {
// Guard Safe
if (strs == null || strs.length == 0) {
return "";
}
// 以 str[0] 作为标兵
int len = strs[0].length();
// 遍历 str[0] 的每一个字符
for (int i = 0; i < len; i++) {
// 遍历 strs[1] ~ strs[strs.length-1]
for (int j = 1; j < strs.length; j++) {
// 与 str[0] 进行比较(字符串长度和当前字符)
if (i >= strs[j].length() || strs[0].charAt(i) != strs[j].charAt(i)) {
return strs[0].substring(0, i);
}
}
}
return strs[0];
}
}