• 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 }


     

  • 相关阅读:
    Wolfram常用计算
    soapUI接口关联教程
    时间序列预测线上充值数据
    基于MySQL分析线上充值留存率
    更改用户资料需要完善脚本
    MySQL建立RFM模型
    Scrcpy使用入门
    虾皮Shopee社招面经分享(大数据开发方向),附内推方式
    MySQL Binlog 解析工具 Maxwell 详解
    MySQL Binlog 介绍
  • 原文地址:https://www.cnblogs.com/qqky/p/7039469.html
Copyright © 2020-2023  润新知