栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《C语言进阶》小乐乐与字符串问题求解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《C语言进阶》小乐乐与字符串问题求解

目录

1.问题描述

2.问题求解
 1.问题描述 描述

在庆祝祖国母亲70华诞之际,老师给小乐乐出了一个问题。大家都知道China的英文缩写是CHN,那么给你一个字符串s,你需要做的是统计s中子串“CHN”的个数。

子串的定义:存在任意下标a < b < c,那么“s[a]s[b]s[c]”就构成s的一个子串。如“ABC”的子串有“A”、“B”、“C”、“AB”、“AC”、“BC”、“ABC”。

输入描述:

输入只包含大写字母的字符串s。(1 ≤ length ≤ 8000)

输出描述:

输出一个整数,为字符串s中字串“CHN”的数量。

题目链接小乐乐与字符串_牛客题霸_牛客网 (nowcoder.com)

2.问题求解

我们拿到题目第一反应想到的就是三个for循环暴力求解

#include
int main()
{
    char s[8000] = { 0 };
    gets(s);
    int i = strlen(s);
    int a = 0;
    int b = 0;
    int c = 0;
    long long count = 0;
    for (a = 0; a < i - 2; a++)
    {
        if (s[a] == 'C')
        {
            for (b = a + 1; b < i - 1; b++)
            {
                if (s[b] == 'H')
                {
                    for (c = b + 1; c < i; c++)
                    {
                        if (s[c] == 'N')
                            count++;
                    }
                }
            }
        }
    }
    printf("%ld", count);
    return 0;
}

但是这里的字符串长度为8e3,于是我们暴力求解后便得到了它

 我们为了算法简洁,我们想到这样一个办法,先遍历字符串,我们设定‘C’的数量为c,当我们遇到一个‘C’时,c++,当又遇到‘H’时我们以此时的下标向后进行一个for循环,碰到一个‘N’则有一个‘’CHN‘’字串。这样的方法就可以减少一次for循环,有效避免了超时的问题。

#include
int main()
{
    char s[8000] = { 0 };
    gets(s);
    int i = strlen(s);
    int a = 0;
    int b = 0;
    int c = 0;
    long long count = 0;
    for (a = 0; a < i; a++)
    {
        if (s[a] == 'C')
            b++;
        if (s[a] == 'H')
        {
            for (c = a + 1; c < i; c++)
            {
                if (s[c] == 'N')
                    count += b;
            }
        }

    }
    printf("%ld", count);
    return 0;
}

本文到此为止,感谢大家的阅读,欢迎大家点赞评论互关,祝大家万事如意。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648317.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号