题目描述
输入一个长度为4的倍数的字符串Q,字符串中仅包含WASD四个字母。
将这个字符串中的连续子串用同等长度的仅包含WASD的字符串替换,如果替换后整个字符串中WASD四个字母出现的频数相同, 那么我们称替换后的字符串是“完美走位”。求子串的最小长度。如果输入字符串已经平衡则输出0。
输入: 一行字符表示给定的字符串S
数据范围: 1<=n<=105且n是4的倍数,字符串中仅包含WASD四个字母。
输出: 整数表示答案
样例输入输出
示例1
输入: WASDAASD
输出: 1
说明: 将第二个A替换为W,即可得到完美走位。
示例2
输入: AAAA
输出: 3
说明: 将其中三个连续的A替换为WSD,即可得到完美走位
解题思路
使用双指针.
示例代码
func q004(input string) int {
charCount := make(map[byte]int)
charCount['W'] = 0
charCount['A'] = 0
charCount['S'] = 0
charCount['D'] = 0
for i := range input {
charCount[input[i]]++
}
num := charCount[input[0]]
needCal := false
for _, c := range charCount {
if c != num {
needCal = true
}
}
if !needCal {
return 0
}
left := 0
right := 0
target := len(input)
charCount[input[right]]--
for left < len(input) {
maxCount := 0
for _, c := range charCount {
maxCount = maxInt(maxCount, c)
}
lackCharNum := 0
for _, c := range charCount {
lackCharNum += maxCount - c
}
length := right - left + 1
completeNum := length - lackCharNum
if completeNum >= 0 && completeNum%4 == 0 {
target = minInt(target, length)
charCount[input[left]]++
left++
} else {
right++
if right >= len(input) {
break
}
charCount[input[right]]--
}
}
return target
}