Understand the problem:
The question asks for finding the longest common prefix (LCP) string among an array of strings. We can take an example to illustrate this problem. For the array of strings
a
bc
cd
The LCP string is empty as there is no common prefix at all.
For the array of strings
a
ab
abc
The LCP string is "a" since a is the longest common prefix string
For an array of strings
abc
abd
abfghi
The LCP string is "ab" since it is the longest common prefix string.
Solution:
Based on the analysis above, we can come up a solution. We compare the character with the same index for each of the string. If the same, we go to the next. There are two termination conditions:
a. the LCP is the shortest string, as in the example 2.
b. the LCP is the substring of a string, we continue until we found the character is different.
Code (Java):
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
for (int i = 0; i < strs[0].length(); i++) {
for (int j = 0; j < strs.length - 1; j++) {
if (i >= strs[j].length() || i >= strs[j + 1].length() || strs[j].charAt(i) != strs[j + 1].charAt(i)) {
return strs[j].substring(0, i);
}
}
}
return strs[0];
}
}
Discussion:
The time complexity of this solution is O(m * n), where m is the length of the LCP string, n is the number of strings in the array.
Summary:
It is not a very difficult question, but requires careful implementation. Note the outer loop, where i < strs[0].length(). Think about why we choose to use strs[0].length() ? Actually what we wanna find is the LCP string. So if strs[0] itself is the LCP string, it is fine. If strs[0] is not, we have other conditions inside of the loop to terminate the loop. How about we choose strs[1]? It is basically correct, however be careful about the size of the array, which has only one element. So we must change the code slightly like this:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
if (strs.length == 1) return strs[0];
for (int i = 0; i < strs[1].length(); i++) {
for (int j = 0; j < strs.length - 1; j++) {
if (i >= strs[j].length() || i >= strs[j + 1].length() || strs[j].charAt(i) != strs[j + 1].charAt(i)) {
return strs[j].substring(0, i);
}
}
}
return strs[1];
}
}
Update on 9/28/15:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < strs[0].length(); i++) {
char curr = strs[0].charAt(i);
int j = 1;
for (j = 1; j < strs.length; j++) {
String str = strs[j];
if (str == null || str.length() == 0 || i >= str.length() || str.charAt(i) != curr) {
break;
}
}
if (j == strs.length) {
sb.append(curr);
} else {
break;
}
}
return sb.toString();
}
}
No comments:
Post a Comment