您的位置:首页 > 其它

Leetcode 14 : Longest Common Prefix

2016-09-29 08:10 411 查看
Q:Write a function to find the longest common prefix string amongst an array of strings.

分析:

一个字符数组的最长公共前序。例如”abcdsa”,”a”,”abcjd”的公共前序就是”a”,不难见得,最长公共前序是由最短的字符串来决定的,那么可以如下的一种思路:

1.求得前两个字符串的公共前序,存为ans

2.如果字符串数组中的字符串的长度小于ans的长度,则进行比对,求得新的公共前序ans,否则不进行比较。

也就是说,例如,“abcdefg”,”abcd”,”abcdef”,”abc”

“abcdefg”与”abcd”的公共前序为”abcd”,记为ans

ans的长度为4,那么ans与字符串”abcdef”比较时,由于字符串”abcdef”的长度为5,而ans的长度为4(最长公共前序是由最短的字符串来决定的),所以不需要进行比较,直接与下一个字符串”abc”进行比较,由于字符串”abc”的长度小于ans(”abcd”),则一次进行比对,求得新的公共前序,并存为ans。

有如下代码(未优化,并未AC,超时):

public class LongestCommonPrefix {
public String longestCommonPrefix(String[] strs) {
if(strs.length<=0 || strs==null)
return " ";
String ans = strs[0];
if(strs.length==1)
return ans;
int i,j ;
for(i=1 ; i<strs.length;i++){
if(ans.length()>strs[i].length()){ //公共前序的长度大于字符串的长度时,需要进行比对,求得新的公共前序
for(j=0;j<strs[i].length();++j){ //逐一比对
if(strs[i].charAt(j)!=ans.charAt(j)) //发现不想同的字符则停止
break;
}
//新的公共前序
ans = String.valueOf(strs[i].subSequence(0,j));
}
}
return ans;
}
}


AC代码:

这种方法空间时间复杂度很小

public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0 || strs == null)
return "";
for(int i=0;i<strs[0].length();i++){
char x = strs[0].charAt(i);
for(int j=1;j<strs.length;j++){
if(strs[j].length()==i || strs[j].charAt(i)!=x)
return strs[0].substring(0,i);

}

}
return strs[0];
}
}


参考:

http://www.cnblogs.com/springfor/p/3872316.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息