|

做題筆記:Longest Common Prefix (Java)

還滿難的一道題。

題目描述:

編寫一個函數來查找字符串數組中最長的共有前綴字符串。

如果沒有共有前綴,則返回一個空字符串""。

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.

Horizontal scanning:

自己嘗試的方法:

class Solution {
    public String longestCommonPrefix(String[] strs)
    {
        int size = strs.length;
        if (size == 0)
            return "";

        if (size == 1)
            return strs[0];

        Arrays.sort(strs);
        int end = Math.min(strs[0].length(), strs[size-1].length());
        int i = 0;
        while (i < end && strs[0].charAt(i) == strs[size-1].charAt(i) )
            i++;
        String pre = strs[0].substring(0, i);
        return pre;
    }
}

1 ms

Vertical scanning:

Solution 中提供的方法二:

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    for (int i = 0; i < strs[0].length() ; i++){
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j ++) {
            if (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
}

Divide and conquer:

Solution 中提供的方法三:

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";    
        return longestCommonPrefix(strs, 0 , strs.length - 1);
}

private String longestCommonPrefix(String[] strs, int l, int r) {
    if (l == r) {
        return strs[l];
    }
    else {
        int mid = (l + r)/2;
        String lcpLeft =   longestCommonPrefix(strs, l , mid);
        String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
        return commonPrefix(lcpLeft, lcpRight);
   }
}

String commonPrefix(String left,String right) {
    int min = Math.min(left.length(), right.length());       
    for (int i = 0; i < min; i++) {
        if ( left.charAt(i) != right.charAt(i) )
            return left.substring(0, i);
    }
    return left.substring(0, min);
}

Binary search:

Solution 中提供的方法四:

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0)
        return "";
    int minLen = Integer.MAX_VALUE;
    for (String str : strs)
        minLen = Math.min(minLen, str.length());
    int low = 1;
    int high = minLen;
    while (low <= high) {
        int middle = (low + high) / 2;
        if (isCommonPrefix(strs, middle))
            low = middle + 1;
        else
            high = middle - 1;
    }
    return strs[0].substring(0, (low + high) / 2);
}

private boolean isCommonPrefix(String[] strs, int len){
    String str1 = strs[0].substring(0,len);
    for (int i = 1; i < strs.length; i++)
        if (!strs[i].startsWith(str1))
            return false;
    return true;
}

Similar Posts

  • |

    PTE Core en français 2026 : tableau CLB, toutes les épreuves, conseils et ressources

    Dernière mise à jour : septembre 2026. Ce guide a été publié pour la première fois en 2024, après que j’ai passé le PTE Core à deux reprises et utilisé mon résultat dans une demande de désignation provinciale. Pour cette mise à jour, j’ai revérifié le tableau de correspondance CLB, les règles linguistiques du permis…

  • |

    INGRESS 戰報 2019 Q3

    真實的時間跨度已經超過 Q3 了,只是之前一直不想去寫,這次借桃園大戰結束,想來記錄一下。說來我這種方式不如放在 Ingress 維基裡面去,發現除了台灣以外的好多詞條都沒有更新(逃 七月第一個星期六,跑到隔壁成都去參加 IFS,因為人數眾多還拆分成了東郊記憶和浣花溪公園兩場。好多成科的人在場,我才得知成科居然有 Ingress 社團這種東西存在……拿到了新版的 passport,白嫖就是美滋滋。最後 Po 了如下原文: 成都 IFS 5.0 2019.7.6 東郊記憶第一次參加大陸的 IFS派卡效率不要不要的印象深刻的還是硬核成電大軍晚上和外地友軍吃了一頓餐廳孃孃評價為「這幾個人哪裡是來吃火鍋的」的純清湯養生火鍋……期待下月再見等等,下……下月?好像哪場都去不了🌚 七月中旬恰逢一位廈藍的小姐姐來重慶取景,她是一部 Ingress 紀錄片的組織人之一,剛好西大有位友軍曾經幫助過她的忙,於是那天就一起和西大友軍們開了飯之後欣賞了搶先版的紀錄片。 那時候正好是 Myriad 系列挑戰的 chapter 1,要 UPH 750 個,當天下午和陪我一起過極黑鳥殲極戰的友軍刷了 100 個。之後硬生生在大夏天的火爐連續出去三天才把這個牌子肝成紫色。 轉生之後一直都很鹹魚,好像之後並無事發生,甚至回到澳門之後玩起了巫師。時間直接就跳到8月在墨爾本參加 IFS 了。噢對,在墨爾本的時候簽到牌黑了,我甚至直接好幾天都沒去開遊戲。po 了如下原文: IFS 2019.8.3 Melbourne Ringwood參加了這麼多次 FS,早已知道模式很固定,我就是去瞎玩認識新大佬的一個合格的 poc 是應該 BBQ 給大家吃的(手動愛特某人)感謝 AP 上友軍的一杯 IPA同我講廣東話的大馬華人🤣第一次感受澳洲的 IFS,氣氛真的超棒啊!Btw 我下個月想玩 field test 耶,FS 真的有點審美疲勞了🙈 重點來了,Field Test。那會聯繫兩位澳門…

  • |

    為何我不喜歡維基社群

    毫無疑問,維基百科是一個偉大的網站。每每使用其他產品彈出捐贈窗口時,想都沒想就會下意識地按下 Remind me later,不過即使是這樣「吝嗇」的我,在使用它這麼多年的此刻,也決定捐贈一筆意思金,因為維基百科真的很偉大。 維基百科很偉大,但維基社群卻並非如想像中那般美好。 維基百科向所有人開放,「人人可編輯」一貫是維基百科宣傳自己的主要標語之一。眾所周知撰寫維基百科並沒有什麼商業利益,只是一群默默奉獻的人在背後維繫著這個龐大的公益網站,他們稱自己叫維基人,組成了名為維基社群的小圈子。既然是人人可以編輯,我要抱怨的是維基社群中進來了一些魚龍混雜的人嗎?恰恰相反,維基社群的成員可能太「精英」了。 不得不說默默耕耘的維基人們也是很偉大的,我沒有任何否定這群無私者的意思,相反我還要對他們說聲辛苦了。畢竟不是人人都願意付出時間精力來做這一件事,官方似乎提供過很漂亮的維基人數字,但那些只提供過一兩條貢獻的維基人在維基歷史上都只是一閃而過。再者中文維基的特殊性,世界上約莫也就四五千萬能正常瀏覽中文維基的中文用戶,所以真正加入維基社群的人並不多,這真的是一個很小的圈子。之前我為了熟悉維基百科編輯的語法,編輯自己的用戶頁以供消遣,並且還對堆砌用戶框產生了謎之興趣,當時的文章都還可以翻到。添加了一些地域性的維基人標籤之後沒過多久,便有人找上門來邀請我加入維基社群,他們其實也渴望著有新鮮血液注入。 我目前的身分也僅僅是一個「群員」罷了,因為我很少參加他們的討論,更不說參加社群聚會這樣的活動,根本不算融入了這個社群。從那不經意翻閲聊天記錄的數眼中,我能感受到撰寫維基百科絕非一件容易上手的事,在這個社群中甚至還形成了師徒關係。可以注意到我一直在用「他們」來指代維基社群,也足以說明我不存在什麼身分認同感,故利益相關:我並不通曉維基社群的所有規矩,我僅以局外人的身分,來講述我為何不喜歡維基社群。 後來某一天當我終於決定要新建一個詞條時,琢磨了許久詞條能不能通過的問題。因為維基百科很嚴格,不是所有的東西都可以收錄進去,並且有一套完整的收錄準則,不得不讓人感嘆著實規範。但實際上當你操作起來的時候,這套規範沒有想像中那麼清晰,稍微冷門一點的東西,就要考慮「關注度」這項指標,但我們不可能去普查全世界有多少人了解我要寫的東西,只能自己把控。對於單槍匹馬的新人來說,不一定能準確把控,也沒有誰預先告知,我也看到在討論頁面下很多新人對關注度這一點提出疑問,這並不是一個個別現象,新人寫好之後直接以關注度不夠這一點斃掉,簡直是可以想像到的勸退。 當我完成詞條並發表之後,問題便發生了——一位資深維基人聲稱我的詞條涉嫌抄襲,封鎖了頁面。嫌麻煩的我確實從其他地方複製粘貼了不少,想到維基百科的規定很嚴格,沒通過也沒什麼好辯駁的,立馬著手修改。不知道是我不會用還是什麼原因,頁面給出的提示是頁面封鎖,草稿給予保留,在谷歌的預覽頁面也還看得見部分文字,但我找了很久實在沒找到草稿在哪,所以第二版等同於用自己的話寫了一遍。(它給出了一個草稿頁面的連結但進去是空的,我寫到這個地方的時候又去別的一個封鎖頁面驗證了一下的確如此,還望諸君答疑) 不過意外的是,第二版被另一位維基人以「仍存在侵權情況,符合快速刪除條件」執行了快速刪除,這下便是真的連草稿都不剩了,義務巡站的維基人動作如此迅速,也確實辛苦啊。當一點都不剩的時候,肯定是會存在一定打擊感的,並且會質疑有人濫權。我寫的是某部國漫的詞條,第二版除了劇情梗概部分都是原創表述,而劇情梗概我是從官網複製下來的,還考慮到可能有被認定為侵權的風險,在那一處附上了官方簡介的連結作為引用來源。這是我一直覺得疑惑的一點,如果官方給出的簡介不能用的話,也拿自己的話替代,不是徒增錯誤解讀或者夾帶私貨的風險嗎?維基百科在解釋著作權時,和關注度一樣,也是嚴謹的長篇大論,CC-BY-SA-3.0 協議,檔次一下就提了上來。其實這些問題在其中都有解答,足以說明維基百科的嚴謹和專業,我的這個問題就和「我想轉載的內容都是常識啊!」一條較為相似,不過按其說法我的確不算合規,也沒有辦法了。在我深入探究著作權這個問題的時候才發現,甚至有文字原作者也出現了侵權問題的案例,聽起來讓人覺得認真到可怕。突然想到國情不同四個字,也許是在體制內的這麼多年有些東西真的刻入靈魂了,實屬不幸。最後的最後,我堅信自己已經被勸退了,所以並沒有第三版的出現。 其實沒寫第三版的除了上面有點小小打擊感這個原因以外,更重要的還是沒有時間和精力去做這件事了,尤其是我這種還會擔憂會不會做無用功的新人,更會畏懼去邁出第一步。倘若從老人視角來看的話,也並非沒有案例,之前有位社群老人在退圈時就提到:到他的年齡,真有這麼一段空餘的時間,首先會想到的是提升自己而不是去寫維基百科。 嚴格到不人性化,是一種什麼樣的感覺呢,就和新聞中那位「我可以不批准你喪假」的老師一樣。我開頭曾說維基社群沒有魚龍混雜,反而是太過於精英,精英到偏執的那種。何況本來也深知維基百科並不能代表最專業的學術的我,反而在這種偏執的追求專業感的反差中感受到了一絲不悅的情緒。一位知乎用戶 Snorri 稱他們為「理性偏執狂」,和我看法相近,這群 「理性偏執狂」取代了「理想主義者」之後,對新人寬容度減小,新手覺得不自由難以溝通。我似乎便是這新人中的一員,並且在這種環境下慘遭勸退。這些看來,師徒關係也不是不可理解,甚至應該說太重要了。(題外話,在這個地方,知乎協議下回答著作權由本人所有,在他沒說禁止轉載以及我沒有商用並署名的情形下,這沒有任何侵權問題,也即是通常的 CC BY-NC-ND 4.0 國際,著作權問題不再多說,不是本文主旨。) 此處開始是臨時插入的東西。大概為了「抱團取暖」,我剛才試圖搜索了一下是否有和我同樣看法的人,然後才有了上面的知乎引用。並無詫異,我好多提到的東西都在這個問題中有所體現,其中不乏有擔當過編輯和巡站的人,例如因關注度不足被大量刪除,又如那位編輯曾刪除過頁面的某位新人用戶再沒有出現過的常態。除此之外似乎有一個重要點被我忽略掉了,好多人把矛盾指向了中文維基社群。誠然我也沒接觸過其他語言的維基社群,開頭也簡略提及過中文圈的狀態,但還是忽略了這一點,有一種想把題目換成「為何我不喜歡中文維基社群」的念頭。 值得一提的是,嚴謹的維基百科自己也提供了「對維基百科的批評」這一詞條,我們僅關注有關編輯的部分就好,這一部分才和維基社群相關。 其中有提到,方舟子在新語絲評價中文維基百科時稱:「幸而我平時只用維基百科的英文版,並無使用其中文版的必要和打算。維基百科的聲譽是靠其英文版打出來的。兩種版本的撰寫者、編者的素質差異擺在那裡。英文版的內容都顯得相當專業,而中文版的內容僅從『方舟子』這個條目就可以看出其草率和偏頗了。」 專業性已解釋過不討論也並不構成不喜歡社群的原因,反而會被那些在中文圈中不斷追求卓越的人所激勵,這句話最驚醒我的一點是「維基百科的聲譽是靠其英文版打出來的」,那麼是否說,我曾經對中文維基社群有過先入為主的看法。此刻我非常不確定,想必是有了。 假使今天中文維基社群來場徹頭徹尾的改革,我想我也過了活躍於維基社群的年齡了。倒也不必假使,中文維基社群亦有不少誠心想將其建設好的有志青年,不可一棒子打死,我也衷心祝願它能朝著更好的地方發展。也正如我捐贈維基來表明我支持維基百科的立場,我也會繼續在閲讀過程有緣做一下修正筆誤更新近況之類的小貢獻,但社群這一腳水,我是不會再淌進去了。

  • |

    初識雪域問題

    雪域淨土一詞,通常用來指代西藏這塊神秘的土地。 雖說從理論上來講,大藏區邊陲離我老家的直線距離並不是很遠,甚至近過我目前活躍的地區,但真正第一次踏上藏區的土地不過前幾日的事情。 關於西藏,我以前所知的東西並不多,還停留在諸如藏族 300 分考 985 這般體制內的滑稽認知,至於傳統文化的東西,頂破天也就是個布達拉宮吧。從前只知道第十四世達賴喇嘛尊者是諾貝爾和平獎得主,但對於他的主張,他為何能拿獎,並沒有深入了解過。此次一行之所見,啟蒙了我對西藏問題的思考。 一個契機是參拜塔爾寺時,看著每個分殿前都貼滿了人民幣,頓覺毛骨悚然,向來在民間都會被稱之為「俗氣」的銅臭之物,卻也能光明正大地出現在宗教場所的大門了?想必是中國特色社會主義噴水池一樣的東西吧。 萬一真是宗教文化則誤傷友軍了,還是耐心聽一聽講解,按導遊的說法, 「錢」和 「虔誠」同音,是信徒表達心意的方式。頓時覺得不對勁,這顯然又是大普通話沙文主義者搞出來的事情,錢虔二字在藏語中肯定不同音吧,退一萬步講在粵語中都只是同韻同調不同聲的兩個字。 嚴謹一點,我還是簡單在詞典中找到了 དངུལ་ལོར།(貨幣) 和 དད་པ། (信仰)兩個詞語,有明顯的差別。(虔誠很難達意,很可能有漏洞,望績學之士指教) 又是變味的文化,我感到非常失望。然而這種情況幾乎不可能被三言兩語逆轉,因為藏民信徒似乎也接受了這種模式,一如那些天天在微博喊著盛世的天然粉紅們。再過一代,文化必然斷層。這樣子還算真正的藏傳佛教嗎,畢竟中國宗教問題也不是第一天了,腦中浮現的是「沒有共產黨就沒有如來佛」的著名標語。 想到一件有意思的事情,我在藏人行政中央官網的「慈悲與智見」分欄下,找到一本《西藏生死書》,想必是擁有較高地位的著作。這時我方才想起,我一位國內朋友曾經給我介紹過《西藏生死書》,只是當初我沒有時間閲讀。但他當時的意思是書中有要求學員無條件服從上師的暗示內容,是很反文明的。後來我得知,其作者本人索甲仁波切上師的確曾有過在美國遭女學員控告性侵一事,眾說紛紜。國內很多討論都和我這位朋友一樣,認為這是反文明的,是「為騙人的東西披上漂亮外衣」,和我接觸的大多國內朋友的觀點一模一樣,不得不讓我驚嘆於這個無神論共產國家的教育著實深入骨髓。 有關打壓西藏文化的惡行,已有 wiki 可供細讀,此處便不再贅述歷史。 必然會反對西藏獨立的某些國內人士聲稱近些年對西藏經濟的促進作用不可否認,這似乎成為一種套路,不管是回答八九民運還是什麼東西,總有人說這一點。姑且可以把西藏遭遇的類文化滅絕行為歸為文化大革命的一環節,文化大革命也絕不是能夠用「近期經濟好」的敷衍陳詞繞過去的歷史。中國早已是物欲橫流的拜金社會,可比我現在待的資本社會資本多了,而提出這種說法還在不斷暗示這是一件好事,讓我想到今天看到的一幅圖: 有點偏題了,突然想到之前一位朋友的觀點是,這些鼓吹經濟發展的人默認把經濟發展當作一件好事了,什麼東西都拿經濟發展來圓場。現在有沒有一個欠發達的藏文國家的例子呢?我的目光轉向了不丹,這個雖然貧窮但號稱世界上最幸福的國家。近來也有聲音指出,這個頭銜名不副實,但討論追求幸福是否重要似乎進入一個哲學命題了。我想對那批藏人而言,他們必然是懷著不自由毋寧死的態度,絕不會滿足於糖衣炮彈。況且不丹體量如此小的國家,經濟會被左右的因素太多了,看看它隔壁同為藏區的錫金就能知道。 藏文本是文獻極為豐富的一套文字系統,其涵蓋的內容從佛家典籍到當今聖上讀錯名字的《格薩爾王》,亦是浩如煙海。而藏人行政中央提到了有推廣藏文教學的老師被抓,這和我一直以來聚焦的守護廣東話的議題其實本質是相同的,中共對於文化的打壓確實是無差別的。除此之外,藏人行政中央提到最多的是有關藏人自焚的問題。此問題已經持續了很多年,實際上並無深入接觸過藏人的我沒辦法妄議太多,分享7年前編程隨想的內容一則。 值得一提的是,達賴喇嘛尊者近年來已經作出了讓步,爭取的只是高度自治而不再主張西藏獨立,雪山獅子旗與西藏正如紫荊花旗與香港。這麼說來若是謀求一個特區地位,恰恰是對一國兩制的諷刺,最近一直在聲援反送中,沒為反送中寫一點感想,卻在此處意外發現不少漏洞,著實有趣。當然中共並未妥協,聲稱這種訴求在 「假自治真獨立」 ,分兩步走。他們的實際目的必然是用拖延戰術,為了等待達賴喇嘛尊者圓寂,這也是他們的一貫手腕,反送中如是,過去許許多多事情也如是。 基於法理的西藏主權問題,說法實在太多,各執一詞,難以判斷誰絕對正確。但以尊者目前的主張來看,放棄獨立追求高度自治,實屬良策。由於近幾個月被 KMT 噁心到了,導致我已經脫離了果粉群體,綜合上述,我的立場正轉變為對一個聯邦制中華構想的支持,因為它恰好能解決上述所有問題。

Leave a Reply

Your email address will not be published. Required fields are marked *