1. 程式人生 > >python 解答科大訊飛-爭吵程式設計題

python 解答科大訊飛-爭吵程式設計題

程式設計題目如下(原文:https://blog.csdn.net/Mr_Police/article/details/84780774 ):

時間限制:C/C++語言2000MS;其他語言4000MS
記憶體限制:C/C++語言65536KB;其他語言589824KB

題目描述:

有n 個人排成了一行佇列,每個人都有一個站立的方向:面向左或面向右。由於這n 個人中每個人都很討厭其他的人,所以當兩個人面對面站立時,他們會發生爭吵,然後其中一個人就會被踢出佇列,誰被踢出佇列都是有可能的。

我們用字元L 來表示一個面向左站立的人,用字元R 來表示一個面向右站立的人,那麼這個佇列可以用一個字串描述。比如RLLR 就表示一個四個人的佇列,其中第一個人和第二個人是面對面站立的。他們發生爭吵後佇列可能會變成LLR,也可能變成RLR;若變成RLR,則第一個人與第二個人還會發生爭吵,佇列會進一步變成LR 或者RR。

若在某個時刻同時可能有很多的爭吵會發生時,接下來只會發生其中的一個,且任意一個都是有可能發生的。

你想知道經過一系列的爭吵後,這個佇列最少會剩下多少人?

輸入

第一行包含一個有字元L 和R 構成的字串。

1 ≤字串長度≤ 105

輸出

輸出佇列中最少會剩下多少人。

樣例輸入

LRRLRL

樣例輸出

2

Hint

一種可能的變化情況是這樣的:

LRRLRL -> LRLRL -> LRRL -> LRL -> LR

python2的解法為:

# 從視窗輸入字串
string = raw_input()
# 每次讓字串長度減少1,如果長度沒減少,將返回None
def shorten(string):
    for i in range(len(string)-1):
        if string[i] == 'R' and string[i+1] == 'L':
            if i == 0:
                return 'R' + string[2:]
                break
            elif string[i-1] == 'R':
                return string[0:i] + 'L' + string[i+2:]
                break
            else:
                return string[0:i] + 'R' + string[i+2:]
                break
# 如果輸入的字串長度為1,則結果為1    
num = len(string)
if num == 1:
    print 1
 # 長度大於等於2時,逐次判斷,直到長度不在減少
while num > 1:
    stringS = shorten(string)
    if stringS == None:
        print num
        break
    else:
        numS = len(stringS)
        if numS == num:
            print num
            break
        else:
            num = numS
            string = stringS