
在第一人称射击游戏中,玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。
假设玩家每按动一次键盘,游戏人物会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人物必定会回到原点,则称此次走位为完美走位。
现给定玩家的走位(例如:ASDA),请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。
请返回待更换的连续走位的最小可能长度。若果原走位本身是一个完美走位,则返回 0。
输入为由键盘字母表示的走位s,例如:ASDA
输出为待更换的连续走位的最小可能长度
1 ≤ s.length ≤ 10^5s.length 是 4 的倍数s 中只含有 A, S, D, W 四种字符要解决这个问题,我们需要找到一个最小的连续子串,通过更换这个子串使得整个走位变成一个完美走位。完美走位的定义是每个方向(A, S, D, W)的步数相同。
using System;
using System.Collections.Generic;
class PerfectWalk
{
public static int MinReplaceLength(string s)
{
int n = s.Length;
int[] count = new int[4]; // 分别记录 A, S, D, W 的步数
// 统计每个方向的步数
foreach (char c in s)
{
switch (c)
{
case 'A': count[0]++; break;
case 'S': count[1]++; break;
case 'D': count[2]++; break;
case 'W': count[3]++; break;
}
}
// 如果已经是完美走位,返回 0
if (count[0] == count[1] && count[1] == count[2] && count[2] == count[3])
{
return 0;
}
// 滑动窗口
int left = 0;
int minLen = n;
for (int right = 0; right < n; right++)
{
// 更新当前窗口内的步数
switch (s[right])
{
case 'A': count[0]--; break;
case 'S': count[1]--; break;
case 'D': count[2]--; break;
case 'W': count[3]--; break;
}
// 检查当前窗口是否满足条件
while (IsPerfect(count))
{
minLen = Math.Min(minLen, right - left + 1);
// 移动左指针
switch (s[left])
{
case 'A': count[0]++; break;
case 'S': count[1]++; break;
case 'D': count[2]++; break;
case 'W': count[3]++; break;
}
left++;
}
}
return minLen;
}
private static bool IsPerfect(int[] count)
{
return count[0] == count[1] && count[1] == count[2] && count[2] == count[3];
}
public static void Main(string[] args)
{
string s = Console.ReadLine();
int result = MinReplaceLength(s);
Console.WriteLine(result);
}
}count 来记录每个方向的步数。s,更新 count 数组。count 数组中的所有值都相等,说明已经是完美走位,直接返回 0。left 和 right 来表示当前窗口的左右边界。count 数组。minLen。count 数组。minLen,即待更换的连续走位的最小可能长度。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。