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 }
时间: 2024-10-29 00:49:21

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

1、黑白卡片--全国模拟(四)

[编程题] 黑白卡片 时间限制:1秒 空间限制:32768K 牛牛有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的.初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上.牛牛现在想要把一些卡片翻过来,得到一种交替排列的形式,即每对相邻卡片的颜色都是不一样的.牛牛想知道最少需要翻转多少张卡片可以变成交替排列的形式. 输入描述: 输入包括一个字符串S,字符串长度length(3 ≤ length ≤ 50),其中只包含'W'和'B'两种字符串,分别表示白色和黑色.整个字符串表示卡片序列的

1、黑化的牛牛--全国模拟(四)

[编程题] 黑化的牛牛 时间限制:1秒 空间限制:32768K 牛牛变得黑化了,想要摧毁掉地球.但他忘记了开启地球毁灭器的密码.牛牛手里有一个字符串S,牛牛还记得从S中去掉一个字符就恰好是正确的密码,请你帮牛牛求出他最多需要尝试多少次密码. 如样例所示S = "ABA",3个可能的密码是"BA", "AA", "AB". 当S = "A", 牛牛唯一可以尝试的密码是一个空的密码,所以输出1. 输入描述: 输

4、 序列交换--全国模拟(四)

[编程题] 序列交换 时间限制:1秒 空间限制:32768K 牛牛有一个长度为n的整数序列s,羊羊要在牛牛的序列中选择不同的两个位置,然后交换这两个位置上的元素.现在需要求出羊羊交换后可以得到的不同的序列个数.(注意被交换的两元素值可能相同). 如序列{1, 47},输出1.羊羊必须交换仅有的两个元素,得到序列{47, 1}.羊羊必须交换,不能保留原有的序列. {1, 2, 1},输出3.羊羊通过交换可以得到{2, 1, 1},{1, 1, 2},{1, 2, 1}这三个序列. 输入描述: 输入

3、膨胀的牛牛--全国模拟(四)

[编程题] 膨胀的牛牛 时间限制:1秒 空间限制:32768K 牛牛以草料为食.牛牛有一天依次遇到n堆被施展了魔法的草料,牛牛只要遇到一堆跟他当前相同大小的草料,它就会把草料吃完,而使自己的大小膨胀一倍.一开始牛牛的大小的是A,然后给出牛牛依次遇到的n堆草料的大小.请计算牛牛最后的大小. 输入描述: 输入包括两行,第一行包含两个整数n和A(1 ≤ n ≤ 200, 1 ≤ A ≤ 1,000,000,000) 第二行包括n个整数,表示牛牛依次遇到的草料堆大小a_i(1 ≤ a_i ≤ 1,000

C语言中返回字符串函数的四种实现方法

有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函数内定义的静态变量(共享) 4.返回全局变量 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 使用分配的内存,地址是有效 char   *fun() {         char*   s   =   (char*)calloc(100,   sizeof(char*)   );         if   (s)                 strcpy   (   s   ,  

字符串+数组模拟大整数乘法

C/C++中存在精度问题,很难做到大整数的加法和乘法操作,这里给出大整数的模拟乘法运算. 模拟原理: 模拟每一个位的值进行相乘,并使其加到对应的位置上,最后保证每一位的数都小于10,即从尾到头扫描一遍进位即可. 主要代码: k=(mx-i)+(mbx-j);//相乘后的位置 c[k-1]+=sum%10; c[k]+=sum/10; for(t=1;t<=k;++t){//保证每一位上的数都小于10 if(c[t]>=10){ //cout<<c[t]<<"

DNA合成--全国模拟(一)

[编程题] DNA合成 时间限制:1秒 空间限制:32768K DNA分子是以4种脱氧核苷酸为单位连接而成的长链,这4种脱氧核苷酸分别含有A,T,C,G四种碱基.碱基互补配对原则:A和T是配对的,C和G是配对的.如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为DNA的双螺旋结构.现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基.问最少需要多少次让两条碱基链配对成功 输入描述: 输入包括一行: 包括两个字符串,分别表示两条链,

UVA 1586 Molar Mass (c++)(字符串处理)(模拟)

题目大意就是给一个只含有C/H/O/N四个字母的分子式,求分子量.跟着题目意思来进行模拟就好了.重点与难点在于如何处理字母后一位数字以上的数字.写得略显繁杂. #include <iostream> #include <string> #include <cstdio> #include <cstring> #define maxn 1000000+10 #include <ctype.h> using namespace std ; doubl

201/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】

问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下:  现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10(B)<50,且A,B均为正整数),你来计算A+B的和C,并按格式在屏幕上打印C. 输入 每组输入包括两个非负整数 A,B(log10(A)<50,log10(B)<50),已EOF结束输入 输出 按格式在屏幕中打印C,数字之间相隔三列0. 样例输入 3 8 样例输出 00100000001