位元組跳動歷屆筆試題(3)

2021-10-14 13:35:26 字數 900 閱讀 2086

【編碼題】字串s由小寫字母構成,長度為n。定義一種操作,每次都可以挑選字串中任意的兩個相鄰字母進行交換。詢問在至多交換m次之後,字串中最多有多少個連續的位置上的字母相同?

第一行為乙個字串s與乙個非負整數m。(1 <= |s| <= 1000, 1 <= m <= 1000000)
乙個非負整數,表示操作之後,連續最長的相同字母數量。
示例1

abcbaa 2
2
使2個字母a連續出現,至少需要3次操作。即把第1個位置上的a移動到第4個位置。

所以在至多操作2次的情況下,最多只能使2個b或2個a連續出現。

思路:若是任意兩個位置可以交換的話,是可以直接二分答案求解的,而本題限制只能相鄰兩個位置進行交換,一種較優的解法是採用動態規劃。

我們首先需要預處理一些東西,首先是每種小寫字元分別在那些位置出現過,我們採用乙個26*n的陣列來儲存,之後定義n*n的dp二維陣列,並令dp[l][r]表示相應小寫字元第l個到第r個連續的最小移動次數。我們發現dp[l][l+1]=v[l+1]-v[l]-1,其中v陣列為儲存相應小寫字母出現的位置,並且我們發現dp[l][r]是可以採用區間dp的實現進行轉移的,其上乙個狀態是dp[l+1][r-1]並且由於將i位置與j位置移動到一起需要(v[j]-v[i]-1)次,但是由於區間內已經有了移動好的(j-i-1)個字母,所以可以少移動這麼多次,固需要減去這個數字,所以動態轉移方程可以寫作:dp[i][j] = dp[i+1][j-1]+(v[j]-v[i]-1)-(j-i-1)。

#include#include#include#include#includeusing namespace std;

string s;

int m;

int work(vectorq)

位元組跳動歷屆筆試題(1)

有三隻球隊,每只球隊編號分別為球隊1,球隊2,球隊3,這三隻球隊一共需要進行 n 場比賽。現在已經踢完了k場比賽,每場比賽不能打平,踢贏一場比賽得一分,輸了不得分不減分。已知球隊1和球隊2的比分相差d1分,球隊2和球隊3的比分相差d2分,每場比賽可以任意選擇兩隻隊伍進行。求如果打完最後的 n k 場...

位元組跳動歷屆筆試題(6)

小明目前在做乙份畢業旅行的規劃。打算從北京出發,分別去若干個城市,然後再回到北京,每個城市之間均乘坐高鐵,且每個城市只去一次。由於經費有限,希望能夠通過合理的路線安排盡可能的省一些路上的花銷。給定一組城市和每對城市之間的火車票的價錢,找到每個城市只訪問一次並返回起點的最小車費花銷。城市個數n 1示例...

位元組跳動筆試題

要求 輸入陣列長度,然後輸入陣列中的各個元素,最後輸入整數k,要求找出陣列中三個元素小於k的三個元素,例如 輸入陣列長度 6 輸入陣列元素 2 0 1 2 3 6 輸出三元組 共4個 下面給出思路和 思路 1 獲得使用者輸入的陣列長度n,若n不為整數,則提示錯誤。2 建立陣列。3 獲得使用者輸入的陣...