您的位置:首页 > 其它

14 Longest Common Prefix

2015-08-22 18:54 260 查看
题目链接:https://leetcode.com/problems/longest-common-prefix/

题目:

Write a function to find the longest common prefix string amongst an array of strings.


解题思路:

最初的想法:

先比较前两个字符串,得出一个公共前缀。由于之后字符串的公共前缀只可能在此基础上进行缩减,所以就以第一个公共前缀和剩余字符串比较,当比较到不同时,就对公共前缀进行缩减。如果公共前缀的长度缩减到小于 0 ,则 “”空字符串是它们的公共前缀。

这种思路要注意的细节比较多。比如,需随时关注公共前缀的末尾下标是否越界(包括向前越界和向后越界)

第二种思路是网上看到的。

这种思路包含两个循环。第一个循环在字符串数组中找出最短的字符串。以这个字符串的长度为比较极限(最长公共前缀不会超过最小字符串的长度),开启第二个循环。第二个循环依次比较每一个字符串的第 i 个字符是否相等。即,每一次循环把所有字符串的第 i 位进行比较。

注意:

第一种方法用到了 StringBuffer 的

deleteCharAt(int index)

Removes the char at the specified position in this sequence.

方法,这是之前没有接触过的 API,偶然发现记录一下。

第一种:

public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0)
return "";
if(strs.length == 1)
return strs[0];
int end = 0;
while(end < strs[0].length() && end < strs[1].length()) {
if(strs[0].charAt(end) != strs[1].charAt(end))
break;
else
end ++;
}
StringBuffer prefix = new StringBuffer();
if(!strs[0].equals("") && !strs[1].equals("")) {
end --;
prefix.append(strs[0].substring(0, end + 1));
} else {
return "";
}
for(int i = 2; i < strs.length; i ++) {
while(!strs[i].startsWith(prefix.toString()) && end >= 0) {
prefix.deleteCharAt(end);
end --;
}
if(end < 0)
break;
}
return prefix.toString();
}
}


117 / 117 test cases passed.
Status: Accepted
Runtime: 312 ms


第二种:

public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0)
return "";
int minLen=Integer.MAX_VALUE;
for(String str: strs){
if(minLen > str.length())
minLen = str.length();
}
if(minLen == 0) return "";

for(int j=0; j<minLen; j++){
char prev='0';
for(int i=0; i<strs.length ;i++){
if(i==0) {
prev = strs[i].charAt(j);
continue;
}

if(strs[i].charAt(j) != prev){
return strs[i].substring(0, j);
}
}
}

return strs[0].substring(0,minLen);
}
}


117 / 117 test cases passed.
Status: Accepted
Runtime: 320 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: