有一串字元,長度為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 乙...