騰訊精選練習題31 最長公共字首

2021-09-19 01:34:01 字數 2318 閱讀 4176

編寫乙個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串""

示例 1:

輸入:["flower","flow","flight"]輸出:"fl"
示例 2:

輸入:["dog","racecar","car"]輸出:""解釋:輸入不存在公共字首。
說明:

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

方法一、

class solution 

l++;

}res=res.substring(0,l>res.length()?res.length():l);

}return res;

}}

方法二、

水平掃瞄法

時間複雜度:o(s),s是所有字串中字元數量的總和。

最壞的情況下,n個字串都是相同的。演算法會將s1與其它字串[s2....sn]都做一次比較。這樣就會進行s次字元比較,其中s是輸入資料中所有的字元數量。

空間複雜度:o(1),我們只需要使用常數級別的額外空間。

class solution         

return prefix;

}}

方法三、

分治思路

這個演算法的思路來自於lcp操作的結合律。 我們可以發現: lcp(s1…sn)=lcp(lcp(s1…sk),lcp(sk+1…sn))lcp(s_1 \ldots s_n) = lcp(lcp(s_1 \ldots s_k), lcp (s_ \ldots s_n))lcp(s1​…sn​)=lcp(lcp(s1​…sk​),lcp(sk+1​…sn​)) ,其中 lcp(s1…sn)lcp(s_1 \ldots s_n)lcp(s1​…sn​) 是字串 [s1…sn][s_1 \ldots s_n][s1​…sn​] 的最長公共字首,1演算法

為了應用上述的結論,我們使用分治的技巧,將原問題 lcp(si⋯sj)lcp(s_i\cdots s_j)lcp(si​⋯sj​) 分成兩個子問題 lcp(si⋯smid)lcp(s_i\cdots s_)lcp(si​⋯smid​) 與 lcp(smid+1,sj)lcp(s_, s_j)lcp(smid+1​,sj​) ,其中mid=i+j2\frac2i+j​。 我們用子問題的解lcpleftlcpright構造原問題的解 lcp(si⋯sj)lcp(s_i \cdots s_j)lcp(si​⋯sj​)。 從頭到尾挨個比較lcpleftlcpright中的字元,直到不能再匹配為止。 計算所得的lcpleftlcpright最長公共字首就是原問題的解 lcp(si⋯sj)lcp(s_i\cdots s_j)lcp(si​⋯sj​)

複雜度分析:

最壞的情況下,我們有n個長度為m的相同字串。

時間複雜度:o(s),s是所有字串中字元數量的總和 s=m*n.

時間複雜度的遞推式為t(n)=2*t(n/2)+o(m),化簡後可知是o(s).最好情況下,演算法會進行minlen*n次比較其中minlen是陣列中最短字串的長度。

空間複雜度:o(m*log(n)).記憶體開支主要是遞迴過程中使用的棧空間所消耗的。一共會進行log(n)次遞迴,每次需要m的空間儲存返回結果,所以空間複雜度為o(m*log(n))

class solution 

private string getlongestcommonprefix(stringstrs,int l,int r)

int mid=l+(r-l)/2;

//[0,mid] [mid+1,r]

string left=getlongestcommonprefix(strs,l,mid);

string right=getlongestcommonprefix(strs,mid+1,r);

return commonprefix(left,right);

}private string commonprefix(string left,string right)

}return left.substring(0,min);

}}

力扣網練習題 最長公共字首

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

騰訊精選練習題30 整數反轉

給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120 輸出 21注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉後整數...

騰訊精選練習題9 反轉鍊錶

反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?方法一 通過記錄前乙個節點的值並通過指標不斷移動的方式 時間複雜度為o n 假設n是列表的長度,時間複雜度是o n 空間複雜度為o 1 defin...