1. 程式人生 > >搜狐[程式設計題]彩色寶石項鍊.有一條彩色寶石項鍊,是由很多種不同的寶石組成的,包括紅寶石,藍寶石,鑽石,翡翠,珍珠等

搜狐[程式設計題]彩色寶石項鍊.有一條彩色寶石項鍊,是由很多種不同的寶石組成的,包括紅寶石,藍寶石,鑽石,翡翠,珍珠等

時間限制:1秒
空間限制:32768K

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

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

輸出描述:

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

示例1
輸入

ABCYDYE
ATTMBQECPD

輸出

1
3
#include <iostream>
#include <string>
#include <map>

int main(void)
{
    std::string str;
    while(std::cin >> str)
    {
        std::map<char,int> mp;
        mp['A'] = 2;
        mp['B'] = 3
; mp['C'] = 5; mp['D'] = 7; mp['E'] = 11; for(int i=1; i<=21; ++i) mp['E'+i] = 1; int len = str.length(); int min = len; for(int i=0; i< len; ++i) { //從第i開始到i-1截止(首尾迴圈),找到包含ABCDE的最短的段, int result = 2310
; for(int j=i; j<2*len;) { if(result % mp[str[j%len]] == 0 ) result = result / mp[str[j%len]]; j++; //j++ 假設i=2,j=13.那麼這裡包含14個長度 if(result == 1) //找到了這個段 { if(j - i < min) min = j-i; break; } /*j是內圈的位置,注意j已經++了。此時如果j%len == i表示首尾迴圈了一圈 了。假設i=5,那麼剛剛j沒自加之前,是j=4進行了比較,此時加加,第5個位置 的數在最開始就比較了,因此這一圈已經迴圈完了。應該跑到i=6的位置重新下一個迴圈*/ if(j%len == i) break; } } std::cout << len - min <<std::endl; } return 0; }