编写一个函数来查找字符串数组中的最长公共前缀
1. 首先看题目要求:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”] 输出:“fl” 示例 2:
输入:strs = [“dog”,“racecar”,“car”] 输出:“” 解释:输入不存在公共前缀。
2. 看看解题思路:
// 思路:
// 如果存在公共前缀,则返回该最长前缀。那么依据短板效应,我们可以找出最短的,从最短开始下手比较
// 若不存在,则说明没有公共前缀,返回空字符串。那么首先排除空字符串的情况
//先思考一下有几种特殊情况:
// 1、字符串数组为null,结果就返回空
// 2、字符串数组只有单个字符,只需要返回这个值就行
3. 接下来是代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0){
return "";
}
// 定义一个length
// java中并不支持多维数组,但它允许一维数组作为另一个一维数组的元素,以此来达成多维数组的功能
// strs.length指二维数组strs的行数,strs[0].length指第一行中元素的个数,strs[n].length指第n行中元素的个数
int length = strs[0].length();
// 定义一个strCount来接收数组的长度
int strCount = strs.length;
// 开始遍历字符串数组
for (int i = 0; i < length; i++) {
// 拿到字符串数组中的第一个元素,同其他字符串进行再次for循环比较
char c = strs[0].charAt(i);
for (int j = 0; j < strCount; j++) {
// 考虑找不到最长公共前缀的两种情形
if (i >= strs[j].length() || strs[j].charAt(i) != c) {
return strs[0].substring(0,i);
}
}
}
// 如果字符串数组只有一个字符串时
return strs[0];
} }
- 上面这个方法是从第一行元素开始遍历的,如果第一行元素很长,那么耗时就会久,时间复杂度需要高,所以需要换个思路
- 首先我们要找到数组中最小的一个字符串,依据短板效应,最短的数组往往可以很轻松地获取到公共前缀。猜想:极端情况下,最短字符串可能就是最长公共前缀
- 于是我们可以遍历数组的字符串,看看是不是从这个最小字符串开始的,String有个方法可以解决这个问题,即为startsWith方法
- 一直到我们找到不相同字符时,就可以截取字符串了,截取之前的,那必定是最长公共前缀
- 两张返回情况:①遍历完数组返回最小字符串;②最小字符串被截取完了,返回null
直接上代码
class Solution {
public String longestCommonPrefix(String[] strs) {
// 字符串为空,直接返回空字符串
if(strs.length == 0) {
return "";
};
// 调用获取最小长度方法
String s = findMinLen(strs);
// 开始遍历字符串数组
for(String string : strs) {
// 如果这个字符串不是以最小字符串开头的,直接返回空字符串
while(!string.startsWith(s)){
if(s.length() == 0) return "";
// 截取最小字符串,最小字符串长度 -1
s = s.substring(0,s.length() - 1 );
}
}
// 返回最长公共前缀
return s;
}
public String findMinLen(String[] strs) {
// 首先定义最小字符串就是第一个字符串数组
String minStr = strs[0];
// 开始遍历
for(String string : strs) {
// 如果其他的字符串数组的长度小于最小字符串的长度
if(string.length() < minStr.length()){
// 将最小字符串数组赋值
minStr = string;
}
}
//返回最小字符串
return minStr;
}
}
结果还行,O(n)