week5C 平衡字串

2021-10-04 05:52:12 字數 1451 閱讀 8795

有一串字元,長度為n(n為4的倍數),其中僅包含 『q』, 『w』, 『e』, 『r』 四種字元。如果四種字元在字串**現次數均為 n/4,則其為乙個平衡字串。可將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,求替換字串的最小長度。

一串字元。

字串的最小長度,如果本來就是平衡的,則輸出0。

利用尺取法可以得到,首先可知,替換的字串越長其越能成功。即有尺取的區間l和r。如果當前的區間不能替換成功,則說明區間小了,則r++,否則區間能成功,可嘗試更小的區間l++。 接下來即為能否成功的判定條件,首先需要在這個而區間外的各個字元的個數。不妨設為sum[0~3]。因為替換後字元的數量只會增加,故要想平衡則向字元數最大的乙個(設為max),則需要替換的字元數量為 total=4max-(sum[1~3])。此時可替換的為free=r-l+1。若free>total,且替換後free的值仍為4的倍數,則為可以成功,否則不成功。每次符合條件後,可判定是否為當前最短的,再選擇是否覆蓋。最後輸出最短的長度即可。注意在移動區間的時候,要更新sum的值,即有新的字元進來,有舊的字元出去。

一開始準備用getchar讀字元,但不知道最後終止的條件,然後用的string讀,同時可以得到字串的長度。

#include

#include

#include

#include

using

namespace std;

int sum[4]

;int num=

100000

;//所需要替換的字母數量

intf

(char c)

intfmax()

intmain()

int j=

f(c[0]

);sum[j]--;

int l=

0,r=0;

//左右端點

int max=

fmax()

;//字元數最多的

int total=r-l+1;

//可修改的

int free=total-(4

*max-sum[0]

-sum[1]

-sum[2]

-sum[3]

);//剩餘修可供修改的

while(1

)else

else

j=f(c[r]);

sum[j]--;

} max=

fmax()

; total=r-l+1;

free=total-(4

*max-sum[0]

-sum[1]

-sum[2]

-sum[3]

);}if

(num==

100000

) num=0;

cout

}

week5 C 平衡字串(尺取法)

一 題目描述 乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。input 一...

Week 5 C 平衡字串(尺取法)

問題描述 乙個長度為n n是4的倍數 的字串s,其中僅包含 q w e r 四種字元。若四種字元在字串 現次數均為n 4,則其為乙個平衡字串。現可以將s中連續的一段子串替換為相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?若s已經平衡則輸出0。準備知識 尺取法 1....

WEEK5 作業 C 平衡字串

乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。一行字元表示給定的字串s 乙...