题目描述
在第一人称射击游戏中,玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。
假设玩家每按动一次键盘,游戏任务会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏任务必定会回到原点,则称此次走位为完美走位。
现给定玩家的走位(例如:ASDA),请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。
请返回待更换的连续走位的最小可能长度。
如果原走位本身是一个完美走位,则返回0。
输入描述
输入为由键盘字母表示的走位s,例如:ASDA
输出描述
输出为待更换的连续走位的最小可能长度。
用例
输入 | WASDAASD |
输出 | 1 |
说明 | 将第二个A替换为W,即可得到完美走位 |
输入 | AAAA |
输出 | 3 |
说明 | 将其中三个连续的A替换为WSD,即可得到完美走位 |
解题思路分析
题目要求将玩家的走位调整成一个完美走位,完美走位定义为上下左右(WASD)各个方向的步数相同。我们需要找到待更换的连续走位的最小可能长度,使得原走位变成完美走位。
-
输入描述:
- 一行字符串表示的走位,例如:
ASDA
。
- 一行字符串表示的走位,例如:
-
输出描述:
- 一个整数,表示待更换的连续走位的最小可能长度,如果原走位本身是一个完美走位,则返回
0
。
- 一个整数,表示待更换的连续走位的最小可能长度,如果原走位本身是一个完美走位,则返回
解题步骤:
-
统计各个方向的步数:
- 统计字符串中
W
,A
,S
,D
各自的数量。
- 统计字符串中
-
判断是否为完美走位:
- 如果
W
,A
,S
,D
的数量相等,则直接返回0
。
- 如果
-
滑动窗口查找最小更换长度:
- 使用滑动窗口技术在字符串中查找一个子串,使得通过更换这个子串可以使得原走位变成完美走位。
- 计算所需的最小窗口长度。
C++程序实现
#include <iostream>
#include <string>
#include <unordered_map>
#include <climits>
using namespace std;
int findMinLength(string s) {
unordered_map<char, int> count;
for (char c : s) {
count[c]++;
}
int n = s.length();
int target = n / 4;
if (count['W'] == target && count['A'] == target && count['S'] == target && count['D'] == target) {
return 0;
}
int minLength = INT_MAX;
int left = 0;
for (int right = 0; right < n; ++right) {
count[s[right]]--;
while (count['W'] <= target && count['A'] <= target && count['S'] <= target && count['D'] <= target) {
minLength = min(minLength, right - left + 1);
count[s[left]]++;
left++;
}
}
return minLength;
}
int main() {
string s;
cin >> s;
int result = findMinLength(s);
cout << result << endl;
return 0;
}
Python程序实现
def find_min_length(s):
from collections import Counter
count = Counter(s)
n = len(s)
target = n // 4
if count['W'] == target and count['A'] == target and count['S'] == target and count['D'] == target:
return 0
min_length = float('inf')
left = 0
for right in range(n):
count[s[right]] -= 1
while count['W'] <= target and count['A'] <= target and count['S'] <= target and count['D'] <= target:
min_length = min(min_length, right - left + 1)
count[s[left]] += 1
left += 1
return min_length
# 输入
s = input().strip()
# 计算并输出结果
result = find_min_length(s)
print(result)
解释
上述代码通过统计各个方向的步数,并使用滑动窗口技术在字符串中查找一个子串,通过更换这个子串可以使得原走位变成完美走位。C++和Python实现的逻辑一致,分别通过调整窗口的左右边界来找到最小的更换长度。