【LittleDuck_LeetCodeNote】14 - Longest Common Prefix

更新於 發佈於 閱讀時間約 10 分鐘

A realistic, brightly colored interior home-style drawing in blue tones of a software engineer. - Leonardo.ai

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
6會員
36內容數
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Steven SHIH的沙龍 的其他內容
Roman to Integer : 將羅馬數字轉換成阿拉伯數字。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Roman to Integer : 將羅馬數字轉換成阿拉伯數字。
Palindrome Number : 判斷x是否為迴文 ( 左到右,右到左,內容皆相同 ) ,若符合回傳true,不符合則回傳false。
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
給定一組字符串,找出它們的最長公共前綴 (Longest Common Prefix)。如果沒有公共前綴,返回空字串 ""。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
給定一組字符串,找出它們的最長公共前綴 (Longest Common Prefix)。如果沒有公共前綴,返回空字串 ""。
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
題目敘述 Longest Palindromic Subsequence 給定一個字串s,請找出字串s的最長回文子序列的長度。 註: 子序列 不要求一定要連續。 測試範例 Input: s = "bbbab" Output: 4
Thumbnail
題目敘述 Longest Palindromic Substring 給定一個輸入字串s,請找出最長的回文子字串。 答案可能不只一個,回傳任何一個合法的答案皆可。
Thumbnail
給定兩個輸入整數陣列, 若在兩個陣列遇到相同的數字可以連成一線, 但是有規定連線不可和別的連線有交叉, 請問最多可以形成幾條連線? 解答中探討了演算法化簡的技巧和DP模型, 可以透過演算法化簡的技巧, 把這題映射到原本已經學會的Longest Common Subsequence的DP模型來解開。
Thumbnail
給定一個字串s,以s擁有的字元製造迴文字串。要能製造出的迴文字串長度最長是多少,觀察迴文字串不外乎兩種模式對稱部分 + 核心字元 + 對稱部分,其中,核心字元在正中央出現一次,或者 對稱部分 + 對稱部分。使用演算法統計出現次數並推理出盡可能充分利用每個字元的迴文字串製造方法。
Thumbnail
題目敘述 題目會給定兩個輸入字串str1和str2,要求我們找出這兩個字串的最大共同子字串。 如果無解,則返回空字串""。 題目的原文敘述 測試範例 Example 1: Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" Exam
Thumbnail
這題也是滿經典的DP動態規劃教學案例和題目,就順便複習一下吧。 題目敘述 題目會給我們兩個字串text1, text2。 要求我們找出兩個字串的最長共同子序列,並且返回最長共同子序列的長度。 如果彼此沒有共同子序列,則返回0。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的