【京東】(數據分析工程師-筆試)最優打字策略【Python】
題目描述
在英文的輸入中,我們經常會遇到大小寫切換的問題,頻繁切換大小寫會增加我們按鍵的次數,也會降低我們的打字策略。
衆所周知,切換大小寫有兩種方式,一種是按下“Caps locks”,也就是大寫鎖定鍵,這樣一來,之後的輸入模式都會被切換。另一種是同時按下shift和需要打印的字母,可以臨時切換大小寫(算作按下兩個鍵)。
已知初始狀態下,打字模式是小寫,現在給出需要打印的字符串(區分大小寫),請你計算出最少需要按鍵多少次才能打印出來。
輸入
輸入第一行僅包含一個正整數n,表示字符串的長度(1<=n<=1000000)。
輸入第二行包含一個長度爲n的字符串,僅包含大小寫字母。
輸出
輸出僅包含一個正整數,即最少的按鍵次數。
樣例輸入
6
AaAAAA
樣例輸出
8
只考慮大小寫變換就轉換(18%)
n = int(input())
s = input()
mark = 0
count = 0
for i in range(n):
if mark == 0 :
if 'a'<=s[i]<='z':
count += 1
else:
count += 2
mark = 1
else:
if 'a'<=s[i]<='z':
count += 2
mark = 0
else:
count += 1
print (count)
考試時只是簡單寫了只考慮轉換的情況,結束後牛客刷到了貪心算法
貪心算法(100%)
n = int(input())
s = input()
dp = [[0,0] for i in range(n)]
if 'A' <= s[0] <= 'Z':
dp[0][0] = 2
dp[0][1] = 2
else:
dp[0][0] = 1
dp[0][1] = 2
# print ('第一個字符:',s[0],'當前狀態:',dp[0])
for i in range(1,n):
if 'A' <= s[i] <= 'Z':
dp[i][0] = min(dp[i-1][0]+2,dp[i-1][1]+2)
dp[i][1] = min(dp[i-1][0]+2,dp[i-1][1]+1)
else:
dp[i][0] = min(dp[i-1][0]+1,dp[i-1][1]+2)
dp[i][1] = min(dp[i-1][0]+2,dp[i-1][1]+2)
# print('第{}個字符:'.format(i), s[i], '當前狀態:', dp[i])
print(min(dp[-1][0],dp[-1][1]))