1. 程式人生 > >5、醜陋的字符串--全國模擬(四)

5、醜陋的字符串--全國模擬(四)

結束 改變 style div -h weight -c cout mes

[編程題] 醜陋的字符串 時間限制:1秒 空間限制:32768K 牛牛喜歡字符串,但是他討厭醜陋的字符串。對於牛牛來說,一個字符串的醜陋值是字符串中相同連續字符對的個數。比如字符串“ABABAABBB”的醜陋值是3,因為有一對"AA"和兩對重疊的"BB"。現在給出一個字符串,字符串中包含字符‘A‘、‘B‘和‘?‘。牛牛現在可以把字符串中的問號改為‘A‘或者‘B‘。牛牛現在想讓字符串的醜陋值最小,希望你能幫幫他。 輸入描述: 輸入包括一個字符串s,字符串長度length(1 ≤ length ≤ 50),字符串只包含‘A‘,‘B‘,‘?‘三種字符。 輸出描述: 輸出一個整數,表示最小的醜陋值
輸入例子: A?A 輸出例子: 0 解題思路:本題首先去掉首尾的?,無論首尾問號的個數,均不改變結果,然後從頭第一個不為?的字符開始遍歷,直到尾部第一個不為?的字符結束。 如果下一個字符==前一個字符count++,不相等,且當前字符不為?就移位至下一位計算 如果當前字符為?記錄?的個數,且?前後的非問號字母位置pre、end 如果問號個數為偶數,且前後字符相等例如A??A,則可以count需要+1 ABAA,如果前後字符不同A??B,則count不變 ABAB 如果問號個數為奇數,且前後字符相等例如A???A,則可以count不變 ABABA,如果前後字符不同A???B,則count+1 ABABB

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     string s;
 7     while(cin>>s)
 8     {
 9         int length = s.size();
10         int count = 0;
11         //去除最前面、最後面的?無論?個數對結果均不產生影響
12         char temp = s[0];
13         int l1 = 0;
14         while(temp == 
?) 15 { 16 l1++; 17 temp = s[l1]; 18 } 19 int l2 = length-1; 20 temp = s[l2]; 21 while(temp == ?) 22 { 23 l2--; 24 temp = s[l2]; 25 } 26 temp = s[l1];//切記將temp的值置回應計算的位置 27 for(int i=l1+1;i<=l2;i++) 28 { 29 if(s[i] == temp) 30 { 31 count++; 32 temp = s[i]; 33 } 34 else 35 { 36 if(s[i] != ?) 37 { 38 temp = s[i]; 39 } 40 else 41 { 42 int count3 = 0;//記錄問號的個數 43 int k = i; 44 int pre = i -1; 45 46 while(s[k] == ?) 47 { 48 count3++; 49 k++; 50 } 51 int end = k; 52 if(count3%2 == 0) 53 { 54 //左右兩側字母相同,則count+1 55 if(s[pre] == s[end]) 56 { 57 count++; 58 i = k; 59 temp = s[k]; 60 } 61 else//不同count不需要++ 62 { 63 i = k; 64 temp = s[k]; 65 } 66 } 67 else//奇數的時候,左右相同相反,相同不變,不同加1 68 { 69 //左右兩側字母相同,則count不變 70 if(s[pre] == s[end]) 71 { 72 i = k; 73 temp = s[k]; 74 } 75 else//不同count不需要++ 76 { 77 count++; 78 i = k; 79 temp = s[k]; 80 } 81 } 82 } 83 } 84 } 85 cout<<count<<endl; 86 } 87 return 0; 88 }


5、醜陋的字符串--全國模擬(四)