基础题4【完美走位】
题目描述
输入一个长度为4的倍数的字符串,字符串中仅包含WASD四个字母。
将这个字符串中的连续子串用同等长度的仅包含WASD的字符串替换,如果替换后整个字符串中WASD四个字母出现的频数相同,那么我们称替换后的字符串是“完美走位”。
求子串的最小长度。
如果输入字符串已经平衡则输出0。
输入描述
一行字符表示给定的字符串s
数据范围:1<=n<=10^5且n是4的倍数,字符串中仅包含WASD四个字母。
输出描述
一个整数表示答案
用例

输入 WASDAASD
输出 1
说明 将第二个A替换为W,即可得到完美走位
输入 AAAA
输出 3
说明 将其中三个连续的A替换为WSD,即可得到完美走位
题目解析
题目要求,保持W,A,S,D字母个数平衡,即相等,如果不相等,可以从字符串中选取一段连续子串替换,来让字符串平衡。
比如:WWWWAAAASSSS
字符串长度12,W,A,S,D平衡的话,则每个字母个数应该是3个,而现在W,A,S各有4个,也就是说各超了1个。
因此我们应该从字符串中,选取一段包含1个W,1个A,1个S的子串,来替换为S。
WWWWAAAASSSS
WWWWAAAASSSS
WWWWAAAASSSS
…
WWWWAAAASSSS
而符合这种要求的子串可能很多,我们需要找出其中最短的,即WAAAAS。
本题其实就是求最小覆盖子串,同LeetCode - 76 最小覆盖子串
解题思路
遍历输入字符串,统计每个字符(W、A、S、D)出现的次数。
使用滑动窗口Q方法,从左到右遍历字符串,根据当前窗口内字符的数量计算需要替换的字符数量。如果当前窗口内字符可以通过替换达到平衡,则尝试更新最小长度。
代码实现
Java代码实现
import java.util.*;
public class Main {
static int minT = 1000000;
static String walk;
static int w,s,a,d,avg;
public static void main(String[] args) {
//walk = "AAAA";
Scanner scanner = new Scanner(System.in)

5990




被折叠的 条评论
为什么被折叠?



