[编程题] 丑陋的字符串
时间限制: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 }