一、題目描述
乙個長度為 n 的字串 s,其中僅包含 『q』, 『w』, 『e』, 『r』 四種字元。如果四種字元在字串**現次數均為 n/4,則其為乙個平衡字串。
現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?
如果 s 已經平衡則輸出0。
inputexamples一行字元表示給定的字串s
output
乙個整數表示答案
inputnoteqwer
output
0input
qqwe
output
1input
qqqw
output
2input
qqqq
output
3
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 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,求替換字串的最小長度。一串字元。字串的最小長度,如果本來就是平衡的,則輸出...