# Leetcode 14:Longest Common Prefix 最長公共字首
公眾號:愛寫bug
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.
Note:
All given inputs are in lowercase letters a-z
.
說明:
所有輸入只包含小寫字母 a-z
。
解題思路Java:
很簡單又很經典的一道題,我的思路起先是 把第字串組第一個字串轉為char型。利用StringBuilder逐一累加相同字元。由於字串長度不一,可以先遍歷找出最小長度字串,這裡我選擇拋錯的形式,減少一次遍歷。
程式碼:
class Solution { public String longestCommonPrefix(String[] strs) { int strLen=strs.length; if(strLen==0) return "";//空字串組返回"" char[] temp=strs[0].toCharArray(); StringBuilder str = new StringBuilder(); for (int i=0;i<strs[0].length();i++){//以第一個字串長度開始比較 for (int j=1;j<strLen;j++){ try { if(temp[i]!=strs[j].charAt(i)){ return str.toString(); } }catch (IndexOutOfBoundsException e){//丟擲錯誤,這裡錯誤是指索引超出字串長度 return strs[j]; } } str.append(temp[i]); } return strs[0]; } }
後面想到Java有 subString()
方法,可指定長度擷取字串,無需轉為 char[]
型,但是在 Leetcode 提交時反而不如上面這種方式運算快,這也說明了Java不支援運算子過載,使用 substring()
每次新建一個String字串,效率並不高。
最後看到一個方法,大致思路是找到最小長度字串,從大到小擷取字串,既然用到 subString()
方法,不如就從後向前,因為題目是找出最長公眾字首,從大到小效率很高。具體請看:
public class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0) return "";
int min=Integer.MAX_VALUE;
String minStr="";
for(int i=0;i<strs.length;i++){//找出最小長度字串
if(min>strs[i].length()){
minStr=strs[i];
min=strs[i].length();
}
}
if(min==0) return "";
for(int i=min;i>=0;i--){//最小長度字串從長到短擷取
String standard=minStr.substring(0, i);
int j=0;
for(j=0;j<strs.length;j++){
if(strs[j].substring(0, i).equals(standard)) continue;
else break;
}
if(j==strs.length) return standard;
}
return "";
}
}
原始碼連結: https://blog.csdn.net/qq_14927217/article/details/72955791
解題思路py3:
再次投機取巧,os.path 封裝函式 commonprefix()
一步到位。
程式碼:
class Solution(object):
def longestCommonPrefix(self, strs):
import os
return os.path.commonprefix(strs)
其實該函式是利用ASCll碼比較的特性來編寫的,原始碼:
def commonprefix(m):
"Given a list of pathnames, returns the longest common leading component"
if not m: return ''
# Some people pass in a list of pathname parts to operate in an OS-agnostic
# fashion; don't try to translate in that case as that's an abuse of the
# API and they are already doing what they need to be OS-agnostic and so
# they most likely won't be using an os.PathLike object in the sublists.
if not isinstance(m[0], (list, tuple)):
m = tuple(map(os.fspath, m))
s1 = min(m)
s2 = max(m)
for i, c in enumerate(s1)://列舉得到s1的每一個字元及其索引
if c != s2[i]:
return s1[:i]
return s1
儘管如此,py3這段程式碼的執行速度依然遠比Java慢的多。
**注:**ASCll碼比較大小並非是按照所有字元的ASCll累加之和比較,是從一個字串第一個字元開始比較大小,如果不相同直接得出大小結果,後面的字元不在比較。
相關推薦
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 empt
LeetCode-14:Longest Common Prefix(最長公共字首)
題目: Write a function to find the longest common prefix string amongst an array of strings. 例子: Example 1: Input: ["flower",
# Leetcode 14:Longest Common Prefix 最長公共字首
公眾號:愛寫bug Write a function to find the longest common prefix stri
【leetcode】14. Longest Common Prefix 最長公共字首
1. 在使用C++ String 類時,要加上 #include <iostream> 和 # include <string> 而不是 <string.h>. string s6(5,'A'); 表示 生成一個字串包含 5 個 ‘A
[LeetCode] 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
[LeetCode] 14. Longest Common Prefix 最長共同前綴
not turn npr longest stc tostring ref 執行 common Write a function to find the longest common prefix string amongst an array of strings. 這
【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 stri
【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 empt
【LeetCode】Longest Common Subsequence最長公共子序列(求出某一解+LCS長度)
Longest Common Subsequence 給出兩個字串,找到最長公共子序列(LCS),返回LCS的長度。 說明 最長公共子序列的定義: • 最長公共子序列問題是在一組序列(通常2個)中找到最長公共子序列(注意:不同於子串,LCS不需要是
python實現Longest Common Subsequence最長公共子序列演算法
最長公共子序列是很基本的演算法,只是最近用到了就又拿來學習一下,網上有很多很多的Java版本的,的確寫的也很不錯,思想都很好,大致上分為三種: 1.基於遞迴的思想 2.基於動態規劃的思想 3.基於HashMap的動態規劃 在這裡我使用的是python來實現,
(LeetCode每日一刷05)最長公共字首
題目描述: 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 ""。 示例: 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["
LeetCode -- 求字串陣列中的最長公共字首
題目描述:Write a function to find the longest common prefix string amongst an array of strings.就是給定1個字串陣列
【LeetCode】#14最長公共字首(Longest Common Prefix)
【LeetCode】#14最長公共字首(Longest Common Prefix) 題目描述 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例 示例 1: 輸入: [“flower”,“flow”,“flight”] 輸出: “
LeetCode 14. 最長公共字首 Longest Common Prefix(C語言)
題目描述: 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例 1: 輸入: [“flower”,“flow”,“flight”] 輸出: “fl” 示例 2: 輸入: [“dog”,“racecar”
14. Longest Common Prefix(最長公共字首) —— Java
Write a function to find the longest common prefix string amongst an array of strings. Example: Given ["abc","ab","abcd"], return "a
LeetCode | Longest Common Prefix(最長公共字首)
題目: Write a function to find the longest common prefix string amongst an array of strings. 求一系列字串的公共字串字首。 題目解析: 沒有想到很好的方法,只能一個字串一個字串的相比較
LeetCode演算法題14:最長公共字首解析
編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例2: 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共
LeetCode:最長公共字首【14】
LeetCode:最長公共字首【14】 題目描述 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 ""。 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","
LeetCode演算法14:java 最長公共字首
題目 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例 1: 輸入: [“flower”,“flow”,“flight”] 輸出: “fl” 示例 2: 輸入: [“dog”,“racecar”,“car”] 輸出: “” 解釋: 輸入不
LeetCode:14. 最長公共字首(C++)
題目: 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 ""。 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出