NowCoder(1):彩色寶石項鍊——搜狐2017校招編程題

題目描述

有一條彩色寶石項鍊,是由很多種不同的寶石組成的,包括紅寶石,藍寶石,鑽石,翡翠,珍珠等。有一天國王把項鍊賞賜給了一個學者,並跟他說,你可以帶走這條項鍊,但是王后很喜歡紅寶石,藍寶石,紫水晶,翡翠和鑽石這五種,我要你從項鍊中截取連續的一小段還給我,這一段中必須包含所有的這五種寶石,剩下的部分你可以帶走。如果無法找到則一個也無法帶走。請幫助學者找出如何切分項鍊才能夠拿到最多的寶石。

輸入:

我們用每種字符代表一種寶石,A表示紅寶石,B表示藍寶石,C代表紫水晶,D代表翡翠,E代表鑽石,F代表玉石,G代表玻璃等等,我們用一個全部爲大寫字母的字符序列表示項鍊的寶石序列,注意項鍊是首尾相接的。每行代表一種情況。

輸出:

輸出學者能夠拿到的最多的寶石數量。每行一個

思路

  1. 設置5個位置指針和5個標誌位,分別用於從第一個寶石開始往後尋找,如果找到了某個需要的寶石,則讓標誌位爲True,並且更新該寶石的位置指針
  2. 如果5個標誌位都已經被置爲True了,說明已經找到了滿足要求的這樣一段寶石,記錄這段寶石的長度,並且把當前滿足要求的寶石中位置在最前面的標誌位改爲Fasle,然後繼續往後面尋找
  3. 可以把兩個字符串連接在一起模擬項鍊的環狀結構
  4. 當前滿足要求的寶石位置最靠前的已經越過了n-1(n爲字符串長度),說明後面已經是重複的情況了,可以跳出。
import sys
jewelry = input();
n = len(jewelry)
jewelry = jewelry + jewelry#把兩個字符串連接在一起,模擬項鍊的環形結構
pos = [0, 0, 0, 0, 0]#初始的ABCDE的位置
flag = [False, False,False, False,False]#初始是否已經找到了ABCDE
length = []#保存滿足條件的項鍊段長度
for i in range(len(jewelry)):
    if min(pos) >= n:#如果當前位置最小的A/B/C/D/E的下標已經達到或者超過了n,說明已經出現了重複,可以跳出
        break
    if jewelry[i] == 'A':#根據當前的寶石來更新寶石A,B,C,D,E的最後一個下標,以及是否找到過該寶石
        pos[0], flag[0] = i, True
    elif jewelry[i] == 'B':
        pos[1], flag[1] = i, True
    elif jewelry[i] == 'C':
        pos[2], flag[2] = i, True
    elif jewelry[i] == 'D':
        pos[3], flag[3] = i, True
    elif jewelry[i] == 'E':
        pos[4], flag[4] = i, True
    if(flag[0] & flag[1] & flag[2] & flag[3] & flag[4]):#如果5種寶石都已經出現過了,就記錄當前的長度
        l = max(pos)-min(pos)+1
        length.append(l)
        flag[pos.index(min(pos))] = False#把當前記錄的長度中最前面的那個寶石設置爲False,向後繼續尋找
print(n - min(length))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章