LeetCode-14-最长公共前缀
题意描述:
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
说明: 所有输入只包含小写字母 a-z 。
示例:
示例1:
输入: ["flower","flow","flight"]
输出: "fl"
示例2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
解题思路:
Alice: 我看了LeetCode官方的题解了,各种写法都要,简直良心。
Bob:是啊,里面还有很多人在互相讨论。
Alice: 那你还要继续写吗,别人都已经写过了。
Bob: 要写,别人写出来是别人的,只有自己写出来了,经历了,思考了才是自己的。可以学习别人的,但是也要有自己的。
Alice: 看来直接比较每一列的字符是最常见的了,首先求得最短字符串的长度,然后按照这个长度去遍历每一列。如果每一列的字符都相等,就是前缀中的字符,否则就要停止了。
Bob: 是的,我用Python写的话,直接用了set
,把第j
列所有的字符取出来set
,一下,如果集合的长度是1
,就说明只有一个字符,就是前缀之一。
Alice: 应该不用求最短的字符串长度吧,就在比较的过程中加一个if
应该也可以。
Bob: Σ(っ°Д°;)っ好---------------------------厉---------------------------------害!
Alice: 你要加油了!!小老弟
代码:
Python 方法一 :
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
boundary = min([len(x) for x in strs]) // 找到所有字符串中的最小长度值
prefix = ""
for x in range(boundary): // 最长的长度就是boundary
temp = set([y[x] for y in strs]) // 取出所有字符串的第x个字符
if len(temp) == 1: // 都是一个字符,加入到前缀
prefix += temp.pop()
else:
return prefix
return prefix
Python 方法一 + 一点点优化。 其实不必寻找到长度最小的字符串,任一的字符串长度都可以,在比较的过程中总会遇到那个长度最短的字符串的,这样就把两次遍历减少到了一次遍历。
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
boundary = len(strs[0])
prefix = ""
for x in range(boundary):
tmp = []
for y in strs:
if len(y) <= x:
return prefix
else:
tmp.append(y[x])
tmp = set(tmp)
if len(tmp) == 1:
prefix += tmp.pop()
else:
return prefix
return prefix
Java 方法一:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}else{
int minLength = strs[0].length();
for(int i=0; i<strs.length; ++i){
if(minLength > strs[i].length()){
minLength = strs[i].length();
}
}
//System.out.println(minLength);
String answer = "";
for(int i=0; i<minLength; ++i){
String prefix = strs[0].substring(0, i+1);
for(int j=1; j<strs.length; ++j){
if(!prefix.equals(strs[j].substring(0, i+1))){
return answer;
}
//System.out.println(answer);
}
answer = prefix;
}
return answer;
}
}
}
c++ 方法一:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0){
return "";
}else{
int minLength = strs.at(0).length();
for(int i=0; i<strs.size(); ++i){
if(minLength > strs.at(i).length()){
minLength = strs.at(i).length();
}
}
//cout << minLength << endl;
string answer = "";
for(int i=0; i<minLength; ++i){
string prefix = strs.at(0).substr(0, i+1);
for(int j=1; j<strs.size(); ++j){
if(prefix != strs.at(j).substr(0, i+1)){
return answer;
}
}
answer = prefix;
}
return answer; // 此处必须是answer 而不能是"", 针对["a"]的情况。
}
}
};
易错点:
一些样例数据:
[]
['', '', '']
['a']
总结: