1. 程式人生 > >Leetcode 466.統計重復個數

Leetcode 466.統計重復個數

bubuko info hit The style bsp max 統計 tex

統計重復個數

定義由 n 個連接的字符串 s 組成字符串 S,即 S = [s,n]。例如,["abc", 3]="abcabcabc"。

另一方面,如果我們可以從 s2 中刪除某些字符使其變為 s1,我們稱字符串 s1 可以從字符串 s2 獲得。例如,"abc" 可以根據我們的定義從 "abdbec" 獲得,但不能從 "acbbe" 獲得。

現在給出兩個非空字符串 S1 和 S2(每個最多 100 個字符長)和兩個整數 0 ≤ N1 ≤ 106 和 1 ≤ N2 ≤ 106。現在考慮字符串 S1 和 S2,其中S1=[s1,n1]和S2=[s2,n2]。找出可以使[S2,M]從 S1 獲得的最大整數 M。

示例:

輸入:

s1 ="acb",n1 = 4

s2 ="ab",n2 = 2

返回:

2

技術分享圖片

int getMaxRepetitions(string s1, int n1, string s2, int n2)

{

int index = 0, repeat_count = 0;

int s1_size = s1.size(), s2_size = s2.size();

for (int i = 0; i < n1; i++) {

for (int j = 0; j < s1_size; j++) {

if (s1[j] == s2[index])

++index;

if (index == s2_size) {

index = 0;

++repeat_count;

}

}

}

return repeat_count / n2;

}

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

int getMaxRepetitions(string s1, int n1, string s2, int n2)

{

if (n1 == 0)

return 0;

int indexr[s2.size() + 1] = { 0 }; // index at start of each s1 block

int countr[s2.size() + 1] = { 0 }; // count of repititions till the present s1 block

int index = 0, count = 0;

for (int i = 0; i < n1; i++) {

for (int j = 0; j < s1.size(); j++) {

if (s1[j] == s2[index])

++index;

if (index == s2.size()) {

index = 0;

++count;

}

}

countr[i] = count;

indexr[i] = index;

for (int k = 0; k < i; k++) {

if (indexr[k] == index) {

int prev_count = countr[k];

int pattern_count = (countr[i] - countr[k]) * (n1 - 1 - k) / (i - k);

int remain_count = countr[k + (n1 - 1 - k) % (i - k)] - countr[k];

return (prev_count + pattern_count + remain_count) / n2;

}

}

}

return countr[n1 - 1] / n2;

}

技術分享圖片

Leetcode 466.統計重復個數