平衡字串 尺取法

2021-10-22 23:50:19 字數 1612 閱讀 6296

乙個長度為 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 一...