题目:Write a function to find the longest common prefix string amongst an array of strings.(写一个函数,找出字符串数组中最长公共前缀)
思路:(我是基于正向考虑的,即从最长公共前缀的第一个字符开始匹配,直到最长公共前缀的最后一个字符为止)先处理两种特殊情况:
1.如果需要判断的字符串集合strs为空,则直接返回结果“”;
2.如果需要判断的字符串集合strs中只要一个元素,则最长公共前缀即为该元素本身,直接返回该元素即可;
一般情况:
先遍历一遍字符串数组strs,找到最短的一个字符串shortestStr,以此为判断标准。每次取shortestStr的一个字串对字符串集合strs中的其它字符串进行前缀匹配,若匹配成功,则该字串为最长公共前缀的一部分,然后使字串在原来的基础上长度增加一,继续进行新一轮的匹配,直到字串等于shortestStr本身为止,否则匹配失败。输出“”;
代码如下:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0) return "";
if(strs.length == 1) return strs[0];
String shortestStr = strs[0];
String ans = "";
int i, shortestStrIndex = 0;
for(i = 1; i < strs.length; i++) {
if(shortestStr.length() > strs[i].length()) {
shortestStr = strs[i];
}
}
while(shortestStrIndex < shortestStr.length()) {
for(i = 0; i < strs.length; i++) {
if(strs[i].indexOf(shortestStr.substring(0, shortestStrIndex+1)) < 0)
break;
else if(!strs[i].substring(0, shortestStrIndex+1).equals(shortestStr.substring(0, shortestStrIndex+1)))
break;
}
if(i == strs.length)
ans = shortestStr.substring(0, shortestStrIndex+1);
shortestStrIndex++;
}
return ans;
}
}
Ps:提交代码之后,通过了。但是运行时间略长,看了一下运行时间最短的代码,才发现第一步没必要找出最短的字符串,因为最长公共前缀是固定的啊。。。这一步操作多余了。参考下面给出LeetCode 记录中最短运行时间的代码,可以发现,这题要是从逆向出发,直接考虑最长公共前缀,则要简单的多。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs==null || strs.length==0) return "";
String prefix = strs[0];
int i=1;
while(i<strs.length){
while(strs[i].indexOf(prefix)!=0)
prefix = prefix.substring(0,prefix.length()-1);
i++;
}
return prefix;
}
}