LeetCode每日一題14. 最長(zhǎng)公共前綴

LeetCode

題目

編寫(xiě)一個(gè)函數(shù)來(lái)查找字符串?dāng)?shù)組中的最長(zhǎng)公共前綴。

如果不存在公共前綴,返回空字符串 ""。

示例 1:
輸入: ["flower","flow","flight"]
輸出: "fl"

示例 2:
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。

說(shuō)明: 所有輸入只包含小寫(xiě)字母 a-z 。


分析

做這種題對(duì)新手最不友好的是用例覆蓋問(wèn)題, 很多時(shí)候提交了發(fā)現(xiàn)這個(gè)用例不行那個(gè)又行, 而且字符串操作有時(shí)候在C語(yǔ)言還會(huì)報(bào)一些內(nèi)存的錯(cuò), 建議可以先從 Python 找思路.

有大佬評(píng)論總結(jié)一般的用例坑必備以下兩種: 非空判斷(整個(gè)列表為空, 或者內(nèi)部的字符串為一個(gè)或多個(gè)空), 單個(gè)元素判斷(列表只有一個(gè)元素, 或者內(nèi)部字符串只有一個(gè)字符.)
解題的時(shí)候也可以按這個(gè)思路, 先覆蓋上述特殊情況再覆蓋一般情況.

回到本題, 先覆蓋上面的情況, 然后遍歷列表找出字符串最小長(zhǎng)度, 用于判空, 同時(shí)作為外圍循環(huán).
內(nèi)層循環(huán)用列表中字符串個(gè)數(shù), 依次比較每個(gè)字符, 不同則返回, 退出內(nèi)層循環(huán)時(shí)再添加字符到結(jié)果字符串.


實(shí)現(xiàn)

C語(yǔ)言的實(shí)現(xiàn)中注意字符串?dāng)?shù)組創(chuàng)建的寫(xiě)法和初始化.避免越界等問(wèn)題.
筆者查看了C語(yǔ)言版本排在前面的兩個(gè)寫(xiě)法, 時(shí)間復(fù)雜度均為O(m*n), 再次測(cè)試該解法耗時(shí)也回到了 8ms 了.

Python 實(shí)現(xiàn)中也有使用枚舉, zip 函數(shù)實(shí)現(xiàn)的, 看起來(lái)很高大上, 但最后的時(shí)間復(fù)雜度一致, 耗時(shí)也相同.

C實(shí)現(xiàn)

char* longestCommonPrefix(char** strs, int strsSize) {
    if(strsSize==1)
        return strs[0];
    if(strsSize==0)
        return "";
    
    int min_len = strlen(strs[0]);
    for(int i=1; i<strsSize; i++)
    {
        if(strlen(strs[i]) < min_len)
            min_len = strlen(strs[i]);
    }
    if(min_len == 0)
        return "";

    char* str=(char*)malloc(min_len+1);
    memset(str,0,min_len+1);
    
    int i,j=0;
    
    while(1)
    {
        i=0;
        while(i<strsSize-1)
        {
            if(strs[i][j]!=strs[i+1][j])
                return str;
            i++;
        }
        str[j]=strs[0][j];
        if(j==min_len)
            return str;
        j++;
    }
    return str;
}
image.png

Python實(shí)現(xiàn)

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 1:
            return strs[0]
        if len(strs) == 0:
            return ""
        
        min_len = min([len(i) for i in strs])
        
        if min_len == 0:
            return ""
        str_list = [list(i) for i in strs]
        result = []
        
        for i in range(min_len):
            for j in range(len(strs)-1):
                if str_list[j][i] != str_list[j+1][i]:
                    return ''.join(result)
            result.append(str_list[j][i])
            if(min_len == i+1):
                return ''.join(result)
image.png

微信公眾號(hào): 程序員的碎碎念

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,711評(píng)論 0 5
  • 《ilua》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶(hù)交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 1...
    葉染柒丶閱讀 11,501評(píng)論 0 11
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,329評(píng)論 0 10
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,651評(píng)論 1 32
  • 感恩昨天晚上賣(mài)雞蛋餅的阿姨。因?yàn)橄掳嘤行┩?。跑過(guò)去只剩最后一個(gè)阿姨留給自己吃的雞蛋餅。看我實(shí)在太餓就讓給了我,而...
    悅心慧兒閱讀 260評(píng)論 0 2

友情鏈接更多精彩內(nèi)容