编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
这道题目看了很多解法,我觉得最符合大众思维的是纵向扫描
1、纵向扫描
怎么扫描?
1)先确定扫描次数,我这里确定扫描次数为字符串数组最短的那个字符串长度
2)然后开始扫描,来比较每个字符串的第一个、第二个、、、第M个字符是不是都相等,如果相等则加入,如果不等就返回
时间复杂度:O(MN),M、N分别代表数组中最短的字符串长度、数组长度
空间复杂度:O(N),这里还是用了一个跟字符串数组等长的数据来存储每个字符串元素的长度
python:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
# 如果是空列表,直接返回
if not strs:
return ""
# 找出列表中最短的那个字符串
length_list= [len(i) for i in strs]
min_length = min(length_list)
# 默认结果为空字符串
res = ""
# 选定列表中最短字符串的长度为遍历次数
for i in range(min_length):
for j in range(len(strs)):
# 以列表第一个字符串为比较对象,如果不相等直接返回res
if strs[0][i] != strs[j][i]:
return res
res += strs[0][i]
return res
java:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
// 求出字符串数组每个元素长度
int[] arr = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
arr[i] = strs[i].length();
}
// 长度数组最小值
int count = Arrays.stream(arr).min().getAsInt();
StringBuilder res = new StringBuilder();
// 纵向扫描
for (int i = 0; i < count; i++) {
for (int j = 0; j < strs.length; j++) {
if (strs[0].charAt(i) != strs[j].charAt(i)) {
return res.toString();
}
}
res.append(strs[0].charAt(i));
}
return res.toString();
}
}