最长公共前缀
题目要求:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: "fl"
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
题目分析:
目的是查找最长前缀是什么?那么解决办法就是使用一个字符记录字符串第一位的字符,之后通过遍历数组来得到每一个数组第一位的字符,和记录的字符相比较,相同则加到等待传出的字符串。之后的位数依此类推。
我的解决代码:
class mySolution {
public String longestCommonPrefix(String [] strs) {
String string = String.valueOf("");
char pop;
int i = 0,length = strs.length;
boolean isCommon = true;
while(true) {
try {
isCommon = true;//用来判断字符是不是相同
pop = strs[0].charAt(i);//记录第一位数字
for(int j = 1; j < length; j++) {
if(strs[j].charAt(i) != pop) {//遍历数组
isCommon = false; break;
}
}
if(isCommon == true) {
string += pop; i++;//加到字符串上,之后开始下一位的比较
} else {
break;
}
} catch(StringIndexOutOfBoundsException ex) {
isCommon = false; break;
} catch(ArrayIndexOutOfBoundsException ex) {
isCommon = false; break;
}
}
return string;
}
}
这里面出现了两个异常,分别捕捉,在遍历数组的时候,可能出现数组下标越界。
第二个就是在执行strs[j].charAt(i) != pop
代码的时候,可能字符串下标越界StringIndexOutOfBoundsException
但是我的代码是有很大问题的,当catch之后最好不要什么都不做,最好进行一些合理的处理。ps:执行时间12ms
LeetCode官方解决办法
(1)水平扫描法
下面代码当中有一个方法是strs[i].indexOf(prefix) != 0
这个的方法返回的是字符串prefix首次出现的索引,当返回的值不是0的话,说明字符串子串没出现过,需要变短字符串。当都不符合条件的时候,字符串为空,那么返回空的字符串。
public String longestPrefix(String [] strs) {
String prefix = strs[0];
int length = strs.length;
for(int i = 1; i < length; i++) {
while(strs[i].indexOf(prefix) != 0) {
//当没出现字符串的时候,可能是字符串太长了,减去尾部的一个字符
prefix = prefix.substring(0, prefix.length() - 1);
if(prefix.isEmpty()) return "";//当字符串是空的时候
}
}
return prefix;
}
运行时间:10ms
还有其他的解决办法,比如说:横向扫描,纵向扫描(好像刚才就是哈)但是暂时没看懂,等着我更新吧…
不对的依然要帮我指出来哈。