🎀 The Problem
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string "".
Example:
Input: strs = ["flower","flow","flight"]
Output: "fl"
👩💻 My Answer
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length < 2)
return strs[0];
String word = strs[0];
String output = "";
Boolean check = false;
for (int i = 1; i < strs.length; i++) {
String word2 = strs[i];
if (i % 2 == 0) {
check = true;
word = "";
}
else if (i % 2 == 1) {
check = false;
output = "";
}
if (!check) {
for (int j = 0; j < Math.min(word.length(), word2.length()); j++) {
if (word.charAt(j) == word2.charAt(j))
output += word.charAt(j);
else
break;
}
} else {
for (int j = 0; j < Math.min(output.length(), word2.length()); j++) {
if (output.charAt(j) == word2.charAt(j))
word += output.charAt(j);
else
break;
}
}
}
if (!check)
return output;
return word;
}
}
Pro & Con
- ✖️ Runtime & Memory (OMG it's so slow)
- ✖️ Too long
- ✖️ Bit complicated (Hard to read)
💋 Ideal Answer
Approach - "Two Pointer"
I read the solution post on LeetCode and found the two approaches. I will explain by using the example:
Input: strs = ["flower","flow","flight"]
Output: "fl"
One approach is:
Set the prefix = first word, so "flower"
Compare the prefix("flower") and next word("flow")
If charAt differs, it substrings to that index (prefix.substring(0, index)
)
Another one is:
Set the prefix = first word, so "flower"
Use strs[i].indexOf(prefix)
to see if strs[i] contains prefix or not.
If not, it reduces the last char of prefix (prefix.substring(0,prefix.length()-1)
)
I tried both and found that the second one is much faster(Beat 100%) than the first one (Beat 64%). The reason is the first one uses nested loop (SUPER inefficient) while the second one uses indexOf(), which is a highly optimized native method in java!
Here is the second method code:
New Code
class Solution {
public String longestCommonPrefix(String[] strs) {
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while(strs[i].indexOf(prefix) != 0){
prefix=prefix.substring(0,prefix.length()-1);
}
}
return prefix;
}
}
💡 What I Learned
Set the prefix = first word. (Learn a better algorithm)
Avoid nested loops at all costs!
Top comments (0)