题目描述
题目难度:简单
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
解题思路
暴力破解法:
n个指针指向n个字符串的首字母,如果这n个指针指向的字母是相同的,则各个指针走一步,如果是不相同的,则记录下第一个字符串的指针的下标,再截取第一个字符串的subString(0,指针下标)
那么如何判断各个指针指向的字母是否相同呢,可以使用一个set,将这n个指针指向的字母都add进set中,判断该set是否size>1,如果大于1,则表示有不相同的字母
代码如下
class Solution {
public String longestCommonPrefix(String[] strs) {
int length=strs.length;
if (length==0) {
return "";
}
if(length==1){
return strs[0];
}
int[] lengths=new int[length];
String string="";
lengths[0]=0;
for (int i = 1; i < strs.length; i++) {
lengths[i]=strs[i-1].length()+lengths[i-1];
}
for (int i = 0; i < strs.length; i++) {
string+=strs[i];
}
if(string.equals("")||string.length()==1){
return "";
}
int minLength=Integer.MAX_VALUE;
for (int i = 0; i < strs.length; i++) {
minLength=Math.min(minLength, strs[i].length());
}
Set<Character> set=new HashSet<>();
boolean flag=true;
int count=0;
while (flag) {
for (int i = 0; i <= lengths.length-1; i++) {
if (lengths[i]>string.length()-1) {
return string.substring(0,count);
}
set.add(string.charAt(lengths[i]));
}
if (set.size()>1) {
break;
}else {
set.clear();
add1(lengths);
count++;
if (count>=minLength) {
return string.substring(0,minLength);
}
}
}
return string.substring(0,count);
}
private void add1(int[] lengths) {
for (int i = 0; i < lengths.length; i++) {
lengths[i]+=1;
}
}
}
其他解题思路
当字符串数组长度为 0 时则公共前缀为空,当字符串数组长度为1时,则公共前缀为strs[0]。可直接求出结果。
令最长公共前缀 为res,并进行初始化为第一个字符串。
遍历后面的字符串,依次将其与 为res 进行比较,两两找出公共前缀,最终结果即为最长公共前缀。
如果查找过程中出现了res为空或者strs[i]为空的情况,则公共前缀为空串,直接返回。
时间复杂度:O(n)。
代码如下
public String longestCommonPrefix(String[] strs) { if (strs.length == 0) { return ""; } if (strs.length == 1) { return strs[0]; } String res = strs[0]; for (int i = 1; i < strs.length; i++) { String str = strs[i]; if (str.equals("") || res.equals("")) { return ""; } int start = 0; while (start < res.length() && start < str.length() && str.charAt(start) == res.charAt(start)) { start++; } res = res.substring(0, start); } return res; }
所以说为什么要学算法,为什么要优化算法,对比两种思路即可得出其间差距。