乙個長度為 n 的字串 s,其中僅包含 『q』, 『w』, 『e』, 『r』 四種字元。
如果四種字元在字串**現次數均為 n/4,則其為乙個平衡字串。
現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?
如果 s 已經平衡則輸出0。
input
一行字元表示給定的字串s
output
乙個整數表示答案
examples
input
qwer
output
0input
qqwe
output
1input
qqqw
output
2input
qqqq
output
note
1<=n<=10^5
n是4的倍數
字串中僅包含字元 『q』, 『w』, 『e』 和 『r』.
尺取法,又稱雙指標法,是陣列上的一種常見操作 ,在遍歷陣列過程中,用兩個相同方向進行掃瞄。
經典應用:尋找滿足某個要求的最小區間q
設定兩個指標l,r,分別代表q的左右邊界。若當前區間不滿足要求,則讓r++,區間增大,尋找符合要求的區間。若當前區間滿足要求,則讓l++,區間減小,以尋找新的區間。
每次找到符合要求的區間加以記錄,以便得到最小區間。
題目要求找到一段連續區間,而且移動方向顯然是明確的,因此可以使用尺取法。
區間符合要求的條件為:四種字元在字串**現次數均為 n/4
如何判斷是否滿足條件
假設現在選中的區間為 [l, r] 。首先我們計算出除此區間以外的四類字元數量sum1,sum2, sum3,sum4 。最大值記為max。若要符合要求,則在 [l, r] 中填充完四類字元,使得sum1=sum2=sum3=sum4後,[l, r] 中剩餘的位置必須為4的倍數,否則,剩餘位置替換後,一定有某一類或幾類字元比別的少,無法平衡。
注意
每次移動l,r,都要更新區間外的四類字元數量。
找到乙個符合要求的區間,要記錄下他的長度。如果當前長度更小,更新最小區間長度。
#include
#include
#include
using
namespace std;
char s[
100050];
int sum1=
0, sum2=
0, sum3=
0, sum4=0;
void
judge
(int i)
void
judge2
(int i)
intmain()
if(sum1 == sum2 && sum1 == sum3 && sum1 == sum4 )
printf
("0\n");
else
else
}printf
("%d\n"
,ans);}
}
平衡字串(替換字串,尺取法)
乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。一行字元表示給定的字串s 乙...
week5 尺取法 平衡字串
title 乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。input 一行...
week5 C 平衡字串(尺取法)
一 題目描述 乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。input 一...