week5 C 平衡字串(尺取法)

2021-10-04 05:23:06 字數 2091 閱讀 2033

一、題目描述

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

3

note

1<=n<=10^5

n是4的倍數

字串中僅包含字元 『q』, 『w』, 『e』 和 『r』.

二、思路概述

1.用sum[4]陣列來記錄qwer四個字母在[l,r]範圍外的數量;

2.初始時l=r=0,每次判斷區間[l,r]是否滿足條件(條件為total=r-l+1;

free=total-(maxsum-sum[0])-(maxsum-sum[1])-(maxsum-sum[2])-(maxsum-sum[3]);

free>=0且free為4的倍數);若滿足條件,若r==l,則l++,r++,否則l++即可,並更新sum的值,若不滿足條件,r++,並更新sum.

三、細節

1.又把l++,和++l搞混了,忘記到底怎麼樣使用才正確,就錯了,真的是,要麼不用了,要麼就要記好使用方法。

2.由於sum的初始值是字串中各個字元的個數,l和r初始時都是1,此時的sum就需要被更新,而我忘了這一點,就導致了錯誤。

四、完整**

#include

#include

#include

#include

#include

using

namespace std;

map<

char

,int

> mp;

intmain()

//初始資料處理

char str[

1000000];

cin>>str;

int num=0;

int sum[4]

;fill

(sum,sum+4,

0);char c;

for(

int i=

0;str[i]

!='\0'

;i++

)// coutint l=0;

//l和r在最開始的時候,都是0,表示從陣列開頭開始

int r=0;

int ans=num;

int total,free,maxsum=0;

if(sum[0]

==num/

4&&sum[1]

==num/

4&&sum[2]

==num/

4&&sum[3]

==num/4)

ans=0;

else

total=r-l+1;

free=total-

(maxsum-sum[0]

)-(maxsum-sum[1]

)-(maxsum-sum[2]

)-(maxsum-sum[3]

);//coutif(free>=

0&&free%4==

0)//若r!=l則l++

else

}//不滿足條件的時候,r++即可

else}}

cout

}

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

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

week5 尺取法 平衡字串

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

week5C 平衡字串

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