5、丑陋的字符串--全国模拟(四)

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


 

原文地址:https://www.cnblogs.com/qqky/p/7039469.html