5、醜陋的字符串--全國模擬(四)
阿新 • • 發佈:2017-06-17
結束 改變 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、醜陋的字符串--全國模擬(四)