每日一道 LeetCode 5 最長公共字首

2022-03-17 18:26:37 字數 2993 閱讀 9416

每日一道 leetcode 前文合集

github:

gitee:

編寫乙個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 ""。

示例 1:

輸入: ["flower","flow","flight"]

輸出: "fl"

示例 2:

輸入: ["dog","racecar","car"]

輸出: ""

解釋: 輸入不存在公共字首。

說明:

所有輸入只包含小寫字母 a-z 。

看到這道題,我又感覺我行了,先聊聊我沒看答案之前的思路,這個思路我覺得是乙個正常人,看到這道題應該有的,如果這個思路都沒有,可能你比較適合學文科。

我的思路一般都很暴力,直接迴圈這個字串陣列,從第乙個開始,挨個向後比較,比較兩個字串的每乙個字元,遇到不一樣的直接返回。

這思路夠簡單、暴力、直接吧,我想大家第一反應應該都能想得到這個方案。

public string longestcommonprefix(string strs) 

return prefix;

}// 獲取兩個字串的公共字首

我在 leetcode 上執行了一下,直接得到這個結果,這個結果應該是我做 leetcode 最好的結果了,竟然耗時小於 1ms ,難道我已經這麼牛皮了麼,我感覺自己飄了。

我滿懷信心的開啟了答案頁,正準備寫個回答裝個 b 的時候,我傻眼了, nm ,這道題竟然有這麼多種解法的啊,心態崩了啊。

忽然想到,剛才我的方案只是乙個最簡單的正向暴力破解的方案,但是我的解法耗時低於 1ms 啊,這麼看來,我的解法還是可以的嘛。

我看到答案上把我上面的那種思路叫做「暴力橫向查詢」,然後大神們按照這個思路,又搞出來了「暴力縱向查詢」。

圖我就不畫了,反正和上面的思路一致,就是把橫向比較換成了縱向比較,然後乙個接乙個比一圈,直到最短的字串長度結束,或者開始出現不一樣的字元為止。

**漲這個樣子:

當我以為到這裡就結束了的時候,我接著往下翻了翻答案,結果發現我自己還是圖樣圖森破啊,我太小看了「學霸」和「大神」這兩個詞。

「分治」這個方案是先把字串陣列從中間切開,然後再按照「暴力橫向查詢」的方案分別取到切開後的兩個陣列的最長字首,最後再從這兩個字首中取交集。

這種方案可以看做是「暴力橫向查詢」方案的乙個變種方案,示意圖如下:

public string longestcommonprefix_2(string strs)  else 

}public string longestcommonprefix(string strs, int start, int end) else

}public string commonprefix(string lcpleft, string lcpright)

}return lcpleft.substring(0, minlength);

}

當然,這種方案還可以接著變種,把「暴力橫向查詢」替換成「暴力縱向查詢」。

最後還有一種二分查詢比較新奇,我覺得刷題少的人肯定想不到這種方案。

這種方案的思路是在字串陣列中,最長公共字首的長度肯定不會超過字串陣列中的最短字串的長度(如果超過了,也不會是最長公共字首)。

首先找到最短的字串長度 minlength ,然後隨機找乙個字串判斷這個 minlength 是否是最長公共字首,如果不是則把這個 minlength 從中間劈開,接著判斷前一半是不是公共字首,如果是,則最長公共字首一定大於等於這一半,如果不是,則最長公共字首一定小於這一半,就這樣逐漸縮小範圍,直到找到為止。

這個我就不畫圖了,就是乙個單純的二分法不停的往下切,直到切中了為止。

public string longestcommonprefix_3(string strs) 

// 定義變數,開始二分法

從上面的結果看下來,好像是二分法的速度是最慢的,實際上這是由於測試的資料集的關係,測試所使用的的資料集可能都比較適合「暴力橫向查詢」這個方案。

Leetcode 每日一道

如果不出意外每天會寫一道演算法題的部落格。如果題目簡單,就一天發布一道。如果題目比較難。我會2 3天發一道演算法的題目。今天寫的這道題目比較簡單。題目如下 解法我是用c 寫的。我的解法的大致想法是 先把需要轉換的矩陣直接轉換成一維的陣列,然後再根據要求把一維中的元素全部截為以c個元素為一組的vect...

LeetCode5 最長回文串

include include include include include include using namespace std ifndef solution h define solution h 思路 從回文串的對稱點開始,依次向左向右比較,不相同的時候停止遍歷,直到找出最大的長度的回文...

LeetCode 5 最長回文串

目錄 1.題目描述 2.解決方案 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 方法一 動態規劃 演算法 用二位陣列來標記字串從下標 i 到下標 j 是否為回...