编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
嗯开始一看是啊挺简单的
最开始我只想到了判断数组第一个字符串的第一个字母和后面元素的第一个字母是否一样
但是我最后没做出来,于是我就想用两个for循环做
打扰了还是没做出来
于是我开始想要不继续在第一种思路上改改吧
于是有了如下一坨代码
以数组的第一个元素作为参照
但其实我觉得用最短的作为参照会更好一点儿
这坨代码已经通过了leetcode的编译
但就是太长了好啰嗦
function FindSameFront(str) {
if(typeof(str[0]) == "undefined"){//如果是个空数组,也直接结束
return "";
}
------------------
var FirstStr = str[0], i = 1, I = 0, data = [str.length],MinLength=FirstStr.length,f;
for(f=1;f<str.length;f++){//找到最短的元素
if(MinLength>str[f].length){
MinLength=str[f].length;
}
}
-----------------------------
for(var g=0;g<str.length;g++) {//如果有元素为空就返回空
if (str[g] === "") {
return "";
}
}
----------------------
if (str.length === 1) {//如果只有一个元素,返回自己
return str[0];
} else{
while (str[i]) {
var temp = str[i], a = 0;//如果当前相等的a就为
while (FirstStr[a] === temp[a] && a < FirstStr.length && a < MinLength) a++;//只要第一个字符串和后面字符串有对应元素相等就继续比较
if (a === 0) {//只要有a=0就结束
return '';
}
data[I] = a; I++;i++;
}//while
data.sort();
return str[0].substring(0,data[0]);
}
}
主要就是如果有匹配到相同的字母
就继续判断这个字符串中后面的字母
等到没有相同的以后就把他们匹配到的下标放在数组中
在判断中,如果有值为0说明没有的前缀
所以最后把数组排序
那么数组中最小的那个数
就是它要截取的长度
while (FirstStr[a] === temp[a] && a < FirstStr.length && a < MinLength)
a必须要小于参照字符串的长度
和最小的字符串的长度
还有一种简单的java版本
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0 ){
return "";
}//如果是空数组或者是空串直接结束
int max = 0;
for(int i = 0;i<strs[0].length() ;i++){//用第一个元素的长度控制循环
char ch = strs[0].charAt(i);
for(String s : strs){
if(i>=s.length() || s.charAt(i) != ch){
return strs[0].substring(0,max);
}
}
max++;
}
return strs[0].substring(0,max);
}