week5 作業 C 平衡字串

2021-10-04 15:25:26 字數 1736 閱讀 3035

乙個長度為 n 的字串 s,其中僅包含 『q』, 『w』, 『e』, 『r』 四種字元。

如果四種字元在字串**現次數均為 n/4,則其為乙個平衡字串。

現可以將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?

如果 s 已經平衡則輸出0。

input

一行字元表示給定的字串s

output

乙個整數表示答案

input

qwer

output 0

input

qqwe

output

1 input

qqqw

output

2put

qqqq

output

3

所求解答案為乙個連續區間,區間左右端點移動有明確方向,所以可以用尺取法。

尺取法流程簡述:

維護雙指標l,r,初始l=r=0,滿足條件l++,不滿足條件r++。

詳細介紹:

用陣列sum記錄不包含在[l,r]區間中四個字元的個數,通過替換使字元數量一致,再判斷剩餘空閒位置是否滿足要求。

max=max(sum[0],sum[1],sum[2],sum[3]);

free=r-l+1-(4*max-sum[0]-sum[1]-sum[2]-sum[3]);

若空閒位置大於等於0且為4的倍數,則滿足要求,l++,否則,r++;

如何計算不包含在[l,r]區間中四個字元的個數:

為了不用每次l,r變化時都遍歷非[l,r]區間計算個數,首先當l=r=0時計算不包含在[l,r]區間中四個字元的個數,若l++,則對應sum[i]++;若r++,則對應sum[i]–。

#include

#include

#include

using

namespace std;

string str=

"qwer"

;int ans=

0,sum[4]

=;intmain()

}*/if(s[i]

==str[0]

) sum[0]

++;if(s[i]

==str[1]

) sum[1]

++;if(s[i]

==str[2]

) sum[2]

++;if(s[i]

==str[3]

) sum[3]

++;}if

(sum[0]

==sum[1]

&&sum[1]

==sum[2]

&&sum[2]

==sum[3]

) ans=s.

size()

;int l=

0,r=

0,add=0;

for(

int i=

0;i<

4;i++

)for

(int i=

1;isize()

;i++

)while

(l<=r&&rsize()

)else

} cout

}

WEEK5 作業 C 平衡字串

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

WEEK5作業 C 平衡字串

題目 乙個長度為 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。一行字元表示給定的字串s。1...