每日一道 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 是否為回...