日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode-14 最长公共前缀

發布時間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode-14 最长公共前缀 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

      • 題目描述
      • 我的解法
      • 反思1
      • 優化1
      • 反思2
      • 優化2
      • 其他思路
      • 總結
      • Github

題目描述

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

如果不存在公共前綴,返回空字符串 “”。

示例 1:

輸入: [“flower”,“flow”,“flight”]
輸出: “fl”

示例 2:

輸入: [“dog”,“racecar”,“car”]
輸出: “”

解釋: 輸入不存在公共前綴。
說明:

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


我的解法

public String longestCommonPrefix(String[] strs) {//特殊情況if(null == strs||0 == strs.length)//字符數組為空的情況return "";if(1 == strs.length)//數組中只有一個字符串,那么前綴就是他本身return strs[0];boolean finalRound = false;boolean isPlusIndex = true;int index = 0;while(!finalRound){for(int i=1; i<strs.length; i++){if(index > strs[i-1].length() ||index > strs[i].length()){//如果超出某個字符串長度了,終止//這個也同時校驗了某一個字符串為空的情況finalRound = true;isPlusIndex = false;break;}if(strs[i-1].substring(0,index).equals(strs[i].substring(0,index))) {} else{//如果前綴不相等了,終止finalRound = true;isPlusIndex = false;break;}}if(isPlusIndex)index++;}return strs[0].substring(0,index-1);//因為我把最開始假設多了一位“”,所以實際的索引要減去一}

用間:9ms
戰勝:77.55%


反思1

  • 其實可以單拿出數組中第一個字符串作為標準,讓其與之后的字符串進行比較。如果有相同前綴,第一個字符串必然也有。若前綴不同則可以直接return “”。
  • 我們在拿第一個字符串為標準比較前綴的時候。舉個例子,比如第一個字符串和第二字符串前5位都是一致的,但是在跟第三個字符串比較的時候只有前三位一致。也就是說,我們的前綴字節數應該是隨著遍歷的深度越來越少。這樣如果我們還是從字符串的第一個字節開始比較的話,很大幾率我們的前幾位字符都是一樣的,這樣就浪費了一些時間。相反我們從字符串的末位字符開始比較,則很快能篩掉不一致的字符。

  • 優化1

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

    用時:9ms
    戰勝:77.55%
    ==! 在我的電腦上并沒有看出太大的差距


    反思2

  • 首先我們拿第一個字符串作為標準,就沒有必要再讓他跟自己比較了
  • 如果發現沒有公共前綴,直接跳出循環,減少系統開銷

  • 優化2

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

    用時:6ms
    戰勝:98.61%


    其他思路

    我比較喜歡這優化的版本,雖然leetcode上有更快的版本(并沒有覺得有什么可圈可點的地方,跑出了4ms估計是網絡電腦的原因,我本機還是跑了9ms)。但是少量的代碼更加意味著思路的清晰。有時候這才是更重要的。


    總結

    有的時候找前面相似的問題,從末位排除是更好的辦法。


    Github

    LeetCode刷題筆記

    總結

    以上是生活随笔為你收集整理的LeetCode-14 最长公共前缀的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。