字符串基本题目,死得好懵。c++,求助,谢谢谢谢!!!

回复帖子

@lmrttx 2020-10-18 14:48 回复

题目: 【文本编辑器(edit)】

问题描述 文本编辑器的基本功能就是统计文章的字符数。

但是,你想实现一款高级的文本编辑器,能够统计文章里每种字母的出现次数。

给定一个仅包含大小写字母,数字,英文逗号,英文句号,空格的字符串,请求出每种字母的出现次数。

注意,'A’与’a’算同一种字母,'B’与’b’算同一种字母…

数据输入

从文件edit.in中读入数据。

输入一行一个字符串。

结果输出 输出到文件edit.out中。

输出26个数字,第 i 个数字表示第 i 个英文字母的出现次数。

输入示例

Welcome to CSP2020.

输出示例

0 0 2 0 2 0 0 0 0 0 0 1 1 0 2 1 0 0 1 1 0 0 1 0 0 0

数据范围

对于20%的数据,仅包含大小写字母。

对于40%的数据,仅包含大小写字母和数字。

对于70%的数据,不包含空格。

对于100%的数据,字符串长度<=10^5.

我的代码: 样例过了,自己造的数据过了。结果交上去每个点竟然1000多ms,还wrong answer了。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int a[27];
char ch[100001];
int main()
{
    //freopen("edit.in","r",stdin);
    //freopen("edit.out","w",stdout);
    gets(ch);
    for(register int i=0;i<strlen(ch);i++)
    {
        if(ch[i]=='\0')break;
        if(ch[i]<='Z'&&ch[i]>='A')
        a[ch[i]-'A']++;
        if(ch[i]<='z'&&ch[i]>='a')
        a[ch[i]-'a']++;
    }
    for(register int i=0;i<26;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
 } 

求助,谢谢

@lmrttx 2020-10-18 14:50 回复 举报

题目好像洛谷没有。这是某省模拟赛的题目路。 @AuCloud 原谅我贸然向您求助。

@Zephyr_ 2020-10-18 14:56 回复 举报

@lmrttx 由于 strlen() 的复杂度为 $O(|s|)$,所以您这么写的复杂度为 $O(|s|^2)$,会超时

@Accepted喵 2020-10-18 15:01 回复 举报

@lmrttx

  • 用getline(cin,ch)读入字符串ch

  • 将所有字母转为小写

  • 数组a注意初始化为0

  • 先转小写,不要边转边计数

@lmrttx 2020-10-18 15:03 回复 举报

@Zephyr_ 所以说,大佬,要怎么样才不会超时呢??? 可能我把strlen的复杂度记错了。。。 超时的话,评测机会显示WA吗??? (不是洛谷,不是洛谷)。

@lmrttx 2020-10-18 15:20 回复 举报

我改成了这样,结果20分了。

#include<bits/stdc++.h>
using namespace std;
int a[100001];
int main()
{
    //freopen("edit.in","r",stdin);
    //freopen("edit.out","w",stdout);
    string s;
    getline(cin,s);
    transform(s.begin(),s.end(),s.begin(),::tolower);
    for(register int i=0;i<s.size();i++)
    {
        a[s[i]-'a']++;
    }
    for(register int i=0;i<26;i++)
    printf("%d ",a[i]);
    return 0;
}

有人帮帮我吗

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。