Leetcode 14 最長公共字首 C

2021-10-03 04:33:03 字數 2027 閱讀 8765

思路:lcp(s1, s2, …, sn)=lcp(lcp(s1, s2)…, sn),即s1~sn的最長公共字首可以轉化為s1和s2的最長公共字首,再求與s3的公共字首等

class

solution

for(

int j=

0; j}return strs[0]

.substr(0

, minn);}

}};

時間複雜度:o(s),s是所有字串的字元數量總和。最壞情況有n個相同的字串,就需要從頭到尾遍歷到所有字元

空間複雜度:o(1),需要常數級別的額外空間

思路:將字串對齊,比較每個字串的第乙個字元,如果相同則繼續向後比較

class

solution}}

}return str;}}

;

時間複雜度:o(s),s是所有字串的字元數量總和。假設有n個字串,最小的長度是minlen,則最好情況是nminlen;當所有的字串長度相同均為m時,有最壞情況,會進行nm次比較

空間複雜度:o(1),需要常數級別的額外空間

思路:用遞迴模擬乙個二叉樹的結構,每個字串為最底層的葉子結點,每個父結點代表的是孩子節點的最長公共字首,則最後遞迴回溯求得的根結點的值即為所有字串的最長公共字首

class

solution

else

return str;

} string longestcommonprefix

(vector

& strs,

int left,

int right)

} string commonprefix

(string str1, string str2)

return str1.

substr(0

, i);}

};

時間複雜度:o(s),s是所有字串字元總和。最好最壞情況下的比較次數同上

空間複雜度:o(mlogn),主要是遞迴過程中使用到的棧空間。假設有n個長度為m的相同字串,每次需要m的空間返回字串,比較次數為logn,那麼就需要mlogn的額外空間

思路:先找到最短字串的長度,用兩個指標乙個指向字串開頭,乙個指向最短字串長度的位置,mid指標指向兩指標中間。每次比較開頭到mid位置的字串是不是最長公共字首,如果是的話,則保留前半部分,將low指向mid+1;如果不是的話,說明後半部分一定不滿足最長公共字首,就將high指標指向mid-1

class

solution

str=strs[0]

.substr(0

,(low+high)/2

);}return str;

}bool

ischecked

(vector

& strs,

int mid)

return

true;}

};

時間複雜度:o(slog(n)),s為所有字串字元總和。(1/2)^n=1,則二分的時間複雜度是o(logn),假設有n個長度為m的相同字串,最多的比較次數s=nm,因此總的時間複雜度是o(s*log(n))

空間複雜度:o(1),需要常數級別的額外空間

等我學了字典樹來填坑~

執行結果比較

反思:前兩種解法是普遍的解法,後三種其實寫起來是容易出錯的,為了開闊眼界才實現的。綜合來看,水平掃瞄既是最好想出來的,也是表現相對較好的。

分治用到了遞迴,是一種空間換時間的解法;二分用了迭代,是用時間換空間的解法

還有還有,string庫函式的呼叫真的很耗效能

LeetCode14最長公共字首

編寫乙個函式來查詢字串陣列中最長的公共字首字串。例如 輸出 ab 比較乙個字串陣列的最長公共字首,遍歷整個字串陣列,建立乙個字串用來儲存當前最長公共字串,逐個比較,不斷更新公共字串內容。情況比較多,考慮周全,不然可能會陣列溢位。公共字串的長度和當前比較字串的長度大小的比較,避免陣列越界,還有空字串的...

LeetCode 14 最長公共字首

編寫乙個函式來查詢字串陣列中最長的公共字首字串。用第乙個字串s,比較strs的每個字串的公共字首,並記錄字首有m位,之後輸出s的前m位字元即可。但是在輸出過程中,使用了如下的賦值方式 for int i 0 i m i ans i s i 在string型別中,內部的成員是private的,所以不能...

LeetCode14 最長公共字首

題目描述 編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母a z。如下 class solutio...