【LittleDuck_LeetCodeNote】14 - Longest Common Prefix

更新 發佈閱讀 11 分鐘

【Instagram】 / 【巴哈姆特小屋】 / 【Vocus方格子】 / 【Medium】
喜歡的話就按個愛心或贊助ㄅ。


vocus|新世代的創作平台

Question and Hints:

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: strs = ["flower","flow","flight"]
Output: "fl"

Example 2:

Input: strs = ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

Constraints:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] consists of only lowercase English letters.

First Solution

💡 這邊的思路是先從前兩個字串找出共同前序,
再用共同前序去和其它字串比較,
比較結果先存在temp,如果temp比較短,就取代掉result,
迴圈結束後回傳最後的共同前序result。

另外有幾個前提先設定好:
  • 如果長度為1,直接回傳第一個值。
  • 如果長度為2,第一次比較完就直接回傳result。
  • 如果有空字串,直接break,或是回傳result,反正就是不要理他。
不過奇怪的是,不知道為什麼程式完全不理 strs[k].length() == 0 (25行)的條件,因此程式不斷出錯,所以沒有submit的結果。
class Solution {
public String longestCommonPrefix(String[] strs) {
String temp = "", result = "";
// if strs only ony string, return itself.
if(strs.length == 1)
return strs[0];

// Find strs[0] & strs[1] the longest same part.
int shortLen = strs[0].length() >= strs[1].length() ? strs[1].length() : strs[0].length();

for(int i=0; i<shortLen; i++){
if(strs[0].charAt(i) == strs[1].charAt(i))
result += strs[0].charAt(i);
else
break;
}

// if strs only ony string, you can return result at the time.
if(strs.length == 2)
return result;

// For arrays of length greater than 2, use temp to detect other words.
for(int k=2; k<strs.length; k++){
temp = "";
if(strs[k].length() == 0)
return result;
int min = result.length() < strs[k].length() ? result.length() : strs[k].length();
for(int m=0; m<min; m++){
if(result.charAt(m) == strs[k].charAt(m))
temp += result.charAt(m);
}
if(temp.length() <= result.length())
result = temp;
}

// get the longest common prefix, return.
return result;
}
}

⏰ Runtime: ?? ms (?? %)

📦 Memory: ?? MB (?? %)



Upgrade Solution

the fastest solution:

💡 前面用縮短的共同前序去做比較的思考方向沒錯,但有更精簡的過程。
  • 如果strs是空的,那就不用比了。
  • 先預設共同前序prefix是第一個字串的所有內容。
  • 用prefix去跟每一個字串比較,比較過程中如果prefix不吻合,就砍掉最後一個字再重新比較一次,直到完全吻合為止,就像削馬鈴薯皮一樣。過程中如果prefix沒了,也就是馬鈴薯被削成粉了,就直接回傳空字串。
  • 直到每一個字串都比較完後,回傳剩下的共同前序。
startsWith(prefix) 是Java裡面用於比對字串的函式,
用來確認字串是否有以prefix作為前序,有就回傳true,沒有就回傳false。
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}

String prefix = strs[0];

for (int i = 1; i < strs.length; i++) {
while (!strs[i].startsWith(prefix)) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) {
return "";
}
}
}

return prefix;
}
}

⏰ Runtime: 0 ms (100 %)

📦 Memory: 40.8 MB (51.26 %)



Upgrade Solution 2

the shortest solution:

💡 這個是完全不同的思路:以剛才馬鈴薯的比喻來說,這個就是挑出差異最大的兩顆馬鈴薯,然後直接把不同的部分切掉,只留下相同的部分。
  • 先對字串進行 Arrays.sort ,確保內容的長度從頭到尾是由小到大,並且依字母順序排列好。例如:[”aaa”, “aa”, “aaa”]排序後會變成["aa", "aaa", “aaa"] ;{ "atocmic", "atoamcy", "atocshie", "atbeijgnlkd" }變成{ “atbeijgnlkd”, “atoamcy”, “atocmic”, “atocshie” }
  • idx代表的是,到第幾個字母前的字串,都屬於共同前序。所以idx不能比s1或s2長,若idx所屬位置字元相同,idx++,檢查下一個字母,若不相同,表示共同前序到此為止,離開迴圈。
  • 最後回傳s1到第idx個字元之前的所有內容,即為共同前序。
class Solution {
public String longestCommonPrefix(String[] strs) {
Arrays.sort(strs);
String s1 = strs[0];
String s2 = strs[strs.length-1];
int idx = 0;
while(idx < s1.length() && idx < s2.length()){
if(s1.charAt(idx) == s2.charAt(idx)){
idx++;
} else {
break;
}
}
return s1.substring(0, idx);
}
}

⏰ Runtime: 1 ms (76.66 %)

📦 Memory: 40.9 MB (43.56 %)

留言
avatar-img
Steven SHIH的沙龍
7會員
36內容數
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
Steven SHIH的沙龍的其他內容
2023/07/10
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
2023/07/10
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
2023/07/10
Remove Element : 在陣列中刪除val後,回傳剩餘的元素個數。
Thumbnail
2023/07/10
Remove Element : 在陣列中刪除val後,回傳剩餘的元素個數。
Thumbnail
2023/07/10
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
2023/07/10
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
看更多
你可能也想看
Thumbnail
題目 : 14. Longest Common Prefix
Thumbnail
題目 : 14. Longest Common Prefix
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
Thumbnail
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
Thumbnail
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
題目會給定一個字串,問我們裡面最大的回文子字串內容為何? 本題目將用中心展開法來解題
Thumbnail
題目會給定一個字串,問我們裡面最大的回文子字串內容為何? 本題目將用中心展開法來解題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News