题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
方法一:
思路: 首先找出第一个字符串和第二个字符串的公共字符串,然后用公共字符串与第三个字符串进行比较,依此类推,在这个过程中不断的调整公共字符串的长度。
class Solution {
public String longestCommonPrefix(String[] strs) {
//方法一:先在前两个字符串中找到公共字符串,
//然后将这个公共字符串中与第三个字符串进行比较并找到公共字符串,与第四个字符串、第五个
if(strs.length == 0) return "";
String prefix = strs[0];
for(int i = 0; i < strs.length; i++){
//等于0时,说明找到了公共字符串,不等于0将不断的截取strs[0],直至找到strs[0]与strs[1]的公共字符串,
//当prefix == ""时,说明strs[0]与strs[1]没有公共字符串,返回"";
while(strs[i].indexOf(prefix) != 0){
prefix = prefix.substring(0, prefix.length()-1);
if(prefix.isEmpty()) return "";
}
}
return prefix;
}
}
方法二:
思路:从第一个字符串中拿到第一个字符,判断第二个字符串中是否存在,依次向后,如果所有的字符串都包含第一个字符串中的第一个字符,那么使用第一个字符串中第二个字符,重复上述操作。
class Solution {
public String longestCommonPrefix(String[] strs) {
//方法二:比较每个字符串的各个字符,选取第一个字符串的首个字符,判断后面其他字符串是否包含,如果包含,判断第二个字符
if(strs == null || strs.length == 0) return "";
for(int i = 0; i < strs[0].length(); i++){
char c = strs[0].charAt(i);
for(int j = 1; j < strs.length; j++){
//如果i等于某个字符串的长度,说明遇到了最短的字符串,它就是最长的公共字符串
//如果某个字符串中i位置上的字符不等于第一个字符i位置上字符,说明公共字符串应该是i-1
if(i == strs[j].length() || strs[j].charAt(i) != c)
return strs[j].substring(0, i);
}
}
return strs[0];
}
}