题目描述:
在第一人称射击游戏中,玩家通过键盘的A 、S 、D 、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。假设玩家每按动一次键盘,游戏人物会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人物必定会回到原点,则称此次走位为完美走位。
现给定玩家的走位(例如:ASDA ), 请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。
请返回待更换的连续走位的最小可能长度。
若果原走位本身是一个完美走位,则返回0 。
输入描述:
输入为由键盘字母表示的走位s,例如:ASDA
输出描述:
输出为待更换的连续走位的最小可能长度
补充说明:
1 、走位长度1 <= s. length <= 10 ^ 5
2 、s. length 是 4 的倍数
3 、s 中只含有 'A' , 'S' , 'D' , 'W' 四种字符
收起
示例1
输入:
ASDW
输出:
0
说明:
已经是完美走位了
示例2
输入:
AASW
输出:
1
说明:
需要把一个A 更换成D ,这样可以得到“ADSW ”或者“DASW ”
示例3
输入:
AAAA
输出:
3
说明:
可以替换后 3 个 'A' ,得到ASDW 。
public class 完美走位 { static int minT = 1000000 ; static String walk; static int w, s, a, d, avg; public static void main ( String [ ] args) {
Scanner scanner = new Scanner ( System . in) ; walk = scanner. nextLine ( ) . toUpperCase ( ) ; avg = walk. length ( ) / 4 ; w = Math . max ( walk. replaceAll ( "[^W]" , "" ) . length ( ) - avg, 0 ) ; s = Math . max ( walk. replaceAll ( "[^S]" , "" ) . length ( ) - avg, 0 ) ; a = Math . max ( walk. replaceAll ( "[^A]" , "" ) . length ( ) - avg, 0 ) ; d = Math . max ( walk. replaceAll ( "[^D]" , "" ) . length ( ) - avg, 0 ) ; solveP ( ) ; } static void solveP ( ) { if ( w == s && s == a && a == d) { System . out. println ( 0 ) ; return ; } System . out. println ( containstr ( 0 , w + s + a + d - 1 , minT) ) ; } static int containstr ( int head, int tail, int minT) { if ( tail > walk. length ( ) ) { return minT; } if ( countOccurrences ( walk. substring ( head, tail) , 'W' ) >= w&& countOccurrences ( walk. substring ( head, tail) , 'S' ) >= s&& countOccurrences ( walk. substring ( head, tail) , 'A' ) >= a&& countOccurrences ( walk. substring ( head, tail) , 'D' ) >= d) { minT = Math . min ( minT, tail - head) ; return containstr ( head + 1 , tail, minT) ; } else { return containstr ( head, tail + 1 , minT) ; } } static int countOccurrences ( String str, char ch) { int length = str. replaceAll ( "[^" + ch + "]" , "" ) . length ( ) ; return length; } }