1. 程式人生 > ># Leetcode 14:Longest Common Prefix 最長公共字首

# 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-14Longest 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-14Longest Common Prefix(公共字首)

題目: Write a function to find the longest common prefix string amongst an array of strings. 例子: Example 1: Input: ["flower",

# Leetcode 14Longest Common Prefix 公共字首

公眾號:愛寫bug Write a function to find the longest common prefix stri

leetcode14. 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 14Longest 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-14Longest 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

LeetCodeLongest 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演算法14java 公共字首

題目 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 “”。 示例 1: 輸入: [“flower”,“flow”,“flight”] 輸出: “fl” 示例 2: 輸入: [“dog”,“racecar”,“car”] 輸出: “” 解釋: 輸入不

LeetCode14. 公共字首(C++)

題目: 編寫一個函式來查詢字串陣列中的最長公共字首。 如果不存在公共字首,返回空字串 ""。 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出