問題描述:
乙個長度為n(n是4的倍數)的字串s,其中僅包含』q』,『w』,『e』,'r』四種字元。若四種字元在字串**現次數均為n/4,則其為乙個平衡字串。現可以將s中連續的一段子串替換為相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?若s已經平衡則輸出0。
準備知識:
尺取法:
1.維護兩個指標l,r,一般用在陣列上,相同方向進行掃瞄。
2.適用範圍:所求解答案為乙個連續區間,區間左右端點移動有明確的方向。
3.當[l,r]滿足要求時,l++,以求取更短或者更優的區間解。
4.當[l,r]不滿足要求時,r++,擴大區間範圍以滿足題目要求。
解題思路:
1.字串平衡時,四種字母的數量均為n/4。
2.字串不平衡時,假定要修改的字串落在了當前[l,r],則該區間之外的四種字母的個數均小於等於n/4。
3.在2成立的條件下,不斷l++優化當前區間,直到2不滿足,記錄一次答案。然後執行r++,直到2滿足。迴圈執行,遍歷字串一次。
**實現:
#include
#include
using
namespace std;
int sumq,sumw,sume,sumr;
void
add(
char
& c)
void
minus1
(char
& c)
intmain()
int o = s.
size()
/4;if
(sumq==o&&sumw==o&&sumr==o&&sume==o)
else
r++;}
cout<}}
總結:一定要判斷初始字串是否平衡,進入尺取後,結果至少為一。 week5 C 平衡字串(尺取法)
一 題目描述 乙個長度為 n 的字串 s,其中僅包含 q w e r 四種字元。如果四種字元在字串 現次數均為 n 4,則其為乙個平衡字串。現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?如果 s 已經平衡則輸出0。input 一...
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 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,求替換字串的最小長度。一串字元。字串的最小長度,如果本來就是平衡的,則輸出...