Cai_Cai.. 2022-01-16 16:52 采纳率: 66.7%
浏览 94
已结题

最少需要删除多少个字符使字符串变成NEUQNEUQ……这种由若干个"NEUQ"组成的形式。

题目:一天Phenix得到了一个长度为nn的字符串,字符串仅由大写字母A~Z组成,现在Phenix想知道最少需要删除多少个字符使字符串变成NEUQNEUQ……这种由若干个"NEUQ"组成的形式。

输入: 第一行一个整数nn,表示字符串长度(n<=10^6)
第二行一个字符串

输出: 一个整数,表示最少需要删除的字符数量。

我最先的思路是判断每一个输入的字符,并用一个flag变量判断以及匹配了几个字符,若输入N时,flag=0 那么代表为开头,否则需要移除该字符count++,若输入 E则判断前面输入的字符是否为N,若是,则该字符正确flag++,否则需要移除该字符count++,这样依次判断,但是测试点一直通不过去。不知道是什么边缘情况未考虑到,大家能否给我点建议,非常感谢了。

这是我思路的源码

#include<stdio.h>

int main()
{
    int n, i;
    scanf("%d", &n);
    getchar();
    char ch,  pre_ch;
    int count=0, flag=0;
    for (i=0; i<n; i++)
    {
        ch = getchar();
        if (n<4)
        {
            printf("%d", count); 
            return 0;
        }
        if (ch == 'N')
        {
            if (flag==0)
            {
                pre_ch = ch;
                flag++;
            }
            else count++;
        }
        else if (ch == 'E')
        {
            if (pre_ch == 'N')
            {
                pre_ch = ch;
                flag++;
            }
            else count++;
        }
        else if (ch == 'U')
        {
            if (pre_ch == 'E')
            {
                pre_ch = ch;
                flag++;
            }
            else count++;
        }
        else if (ch == 'Q')
        {
            if (pre_ch == 'U')
            {
                pre_ch = ch;
                flag++;
            }
            else count++;
        }
        else count++;
        if (flag == 4) flag=0;
    }
    printf("%d", count);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • 关注

    (1)若输入 E则判断前面输入的字符是否为N,若是flag++
    这个逻辑反了吧,如果输入E,前面如果是N,flag不需要++

    (2)if(n<4)的这个if也不应该再for循环里,而且,printf显示的应该是n,不应该是count吧

    参考如下代码:

    #include<stdio.h>
    
    int main()
    {
        int n,i,j=0;
        int count=0;
        char c,sz[]="NEUQ";
        scanf("%d",&n);
        getchar();
        if (n<4)
        {
            printf("%d", n); //如果n小于4,应该删除的字符是n,不是count吧,这里根据你的题目要求来定
            return 0;
        }
        for (i=0;i<n;i++)
        {
            while(i<n &&(c=getchar()) != sz[j])
            {
                i++;
                count++;
            }
            j++;
            if(j==4) j=0;
        }
        printf("%d", count-j);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 修改了问题 1月16日
  • 创建了问题 1月16日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题