[LeetCode] 14. Longest Common Prefix 最长共同前缀
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 1:
Input: ["flower","flow","flight"] Output: "fl"
Example 2:
Input: ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings.
这题有好几种解法,个人认为会1,2的解法就可以了,但这种多方法解题的思路可以好好学习一下。具体可参考:Longest Common Prefix
1. 一个一个字符串取比较word by word matching:
先拿前2个,从第一位开始比较,直到发现有不同的字符,此时前面一样的字符串在去和后面的字符串比较,直到结束。可以用递归。
Time: O(n*m) (n是字符串个数,m是字符串最长长度) Space: O(m)
2. 一个字符一个字符的比较character by character matching:
所有的字符串同时比较第1个,第2个.......,发现有不同的出现,之前一样的就是找到的最长共同前缀。Time: O(n*m) (n是字符串个数,m是字符串最长长度) Space: O(m)
3. divide and conquer:
把所有字符串分成两组,分别去比较,最后都剩一个的时候,两组在比较。Time: O(n*m), Space: O(n*logm)
4. 二分法Binary Search:
先找到最短的字符串,然后把这个最短的字符串二分成前面和后面两部分,前面的和所有剩下字符串比较,如果一样在比较后面的,如果有不一样的,则后面的部分不用比较了,前面的部分在二分比较。Time: O(n*m*logm), Space: O(m)
5. 使用Trie:
首先了解Trie数据结构,然后把所有的字符串都执行一遍插入到Trie,然后读取Trie中最后一个没有分支的node,此时之前这些字符就是答案。
Time: O(n*m + m), Space: O(26*m*n) ~ O(m*n)
Java: Method 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0 ) { return "" ; } String prefix = strs[ 0 ]; for ( int i = 1 ; i < strs.length; i++) { int j = 0 ; while ( j < strs[i].length() && j < prefix.length() && strs[i].charAt(j) == prefix.charAt(j)) { j++; } if ( j == 0 ) { return "" ; } prefix = prefix.substring( 0 , j); } return prefix; } } |
Java: Method 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0 ) return "" ; String res = new String(); for ( int j = 0 ; j < strs[ 0 ].length(); ++j) { char c = strs[ 0 ].charAt(j); for ( int i = 1 ; i < strs.length; ++i) { if (j >= strs[i].length() || strs[i].charAt(j) != c) { return res; } } res += Character.toString(c); } return res; } } |
Java: Method 2
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0 ) return "" ; for ( int j = 0 ; j < strs[ 0 ].length(); ++j) { for ( int i = 0 ; i < strs.length - 1 ; ++i) { if (j >= strs[i].length() || j >= strs[i + 1 ].length() || strs[i].charAt(j) != strs[i + 1 ].charAt(j)) { return strs[i].substring( 0 , j); } } } return strs[ 0 ]; } } |
Python: Method 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Solution( object ): def longestCommonPrefix( self , strs): """ :type strs: List[str] :rtype: str """ if not strs: return "" for i in xrange ( len (strs[ 0 ])): for string in strs[ 1 :]: if i > = len (string) or string[i] ! = strs[ 0 ][i]: return strs[ 0 ][:i] return strs[ 0 ] |
C++: Method 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public : string longestCommonPrefix(vector<string> &strs) { if (strs.size() == 0) { return "" ; } string prefix = "" ; for ( int i = 0; i < strs[0].length(); i++) { for ( int j = 1; j < strs.size(); j++) { if (strs[j][i] != strs[0][i]) { return prefix; } } prefix += strs[0][i]; } return prefix; } }; |
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构