題目描述:
在第一人稱射擊游戲中,玩家通過鍵盤的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; } }