乙個長度為 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
所求解答案為乙個連續區間,區間左右端點移動有明確方向,所以可以用尺取法。
尺取法流程簡述:用陣列sum記錄不包含在[l,r]區間中四個字元的個數,通過替換使字元數量一致,再判斷剩餘空閒位置是否滿足要求。維護雙指標l,r,初始l=r=0,滿足條件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...