專欄:50多種數(shù)據(jù)結(jié)構(gòu)徹底征服

專欄:50多種經(jīng)典圖論算法全部掌握

最近一網(wǎng)友發(fā)文稱:在字節(jié)一面二面三面都很順利,面試官還夸他優(yōu)秀,結(jié)果三面的時候直接把他給掛了。另一網(wǎng)友評論說他們組會把面試者照片發(fā)到群里讓大家選哪個最好看選擇哪個。我聽過卡學(xué)歷,卡年齡,甚至卡性別的,但卡顏值的還是第一次聽過。

如果是面向大眾的工作,比如車模,銷售,服務(wù)員,卡顏值還能理解,畢竟他們面向的是客戶,顏值高的確有優(yōu)勢。如果是對著電腦工作,卡顏值就沒必要了。不過一般來說一份工作不會只找一個人來面試,如果所有面試者都很優(yōu)秀,學(xué)歷,年齡都難分伯仲,卡顏值也未嘗不可。

打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片

--------------下面是今天的算法題--------------

來看下今天的算法題,這題是LeetCode的第1400題:構(gòu)造 K 個回文字符串,難度是中等。

給你一個字符串 s 和一個整數(shù) k 。請你用 s 字符串中所有字符構(gòu)造 k 個非空回文串。如果你可以用 s 中所有字符構(gòu)造 k 個回文字符串,那么請你返回 True ,否則返回 False 。

示例1:

輸入:s = "annabelle", k = 2 輸出:true 解釋:可以用 s 中所有字符構(gòu)造 2 個回文字符串。 一些可行的構(gòu)造方案包括:"anna" + "elble","anbna" + "elle","anellena" + "b"

示例2:

輸入:s = "leetcode", k = 3 輸出:false 解釋:無法用 s 中所有字符構(gòu)造 3 個回文串。

示例3:

輸入:s = "true", k = 4 輸出:true 解釋:唯一可行的方案是讓 s 中每個字符單獨構(gòu)成一個字符串。

  • 1 <= s.length <= 10^5

  • s 中所有字符都是小寫英文字母。

  • 1 <= k <= 10^5

問題分析

這題說的是使用字符串中的所有字符構(gòu)造 k 個回文串,如果字符串的長度小于 k ,無論如何也是完成不了的。如果字符串的長度不小于 k ,我們需要統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù)。

如果每個字符出現(xiàn)的次數(shù)都是偶數(shù),我們可以構(gòu)造成任意 1<=k<=n 個回文子串,比如字符串a(chǎn)abbcccc,可構(gòu)造的回文子串如下:

[abccccba]

[abba,cccc]

[aa,bb,cccc]

[aa,bb,cc,cc]

[aa,bb,cc,c,c]

[aa,bb,c,c,c,c]

[aa,b,b,c,c,c,c]

[a,a,b,b,c,c,c,c]

如果某個字符出現(xiàn)的個數(shù)是奇數(shù),要想構(gòu)造最少的回文串,該字符串必須要在回文串的中間,比如aaabbcc要構(gòu)成一個回文串,則aaa必須要放到中間,如果有構(gòu)成兩個回文串則不需要放到中間。

再來看一個示例,比如字符串a(chǎn)aabbbcc,如果要構(gòu)成一個回文串,無論如何也是實現(xiàn)不了的,因為字符 a 和字符 b 出現(xiàn)的次數(shù)都是奇數(shù),但要構(gòu)成兩個回文串是可以的。

所以我們可以得出如果字符串中出現(xiàn)奇數(shù)次的字符個數(shù)大于 k 的時候,我們是無法分割成 k 個回文串的,否則是可以的。我們只需要統(tǒng)計出現(xiàn)奇數(shù)次字符的個數(shù)即可。

JAVA:

public boolean canConstruct(String s, int k) {     if (k > s.length())         return false;     int[] mp = new int[128];     for (char ch : s.toCharArray())         mp[ch]++;     int odd = 0;// 奇數(shù)的個數(shù)     for (int cnt : mp) {         if (cnt % 2 == 1)             odd++;     }     return k >= odd; }

C++:

public:     bool canConstruct(string s, int k) {         if (k > s.length())             returnfalse;         vector

  mp(128, 0);         for (constauto &ch: s)             mp[ch]++;         int odd = 0;// 奇數(shù)的個數(shù)         for (constauto cnt: mp) {             if (cnt % 2 == 1)                 odd++;         }         return k >= odd;     }

筆者簡介

博哥,真名:王一博,畢業(yè)十多年, 作者,專注于 數(shù)據(jù)結(jié)構(gòu)和算法 的講解,在全球30多個算法網(wǎng)站中累計做題2000多道,在公眾號中寫算法題解800多題,對算法題有自己獨特的解題思路和解題技巧,喜歡的可以給個關(guān)注,也可以 下載我整理的1000多頁的PDF算法文檔 。