纯C语言|简便方法|解题报告(第18例) ASCII码(二)

本文通过三个典型字符串题目,介绍如何利用哈希数组统计字符频率:判断字符串是否由唯一字符组成、寻找首次出现的单一字符及判断一字符串是否为另一字符串的子集。此方法简单高效,适合初学者掌握。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三道题的共同部分就是 使用一个hash[256](数组),去标记字符出现的次数,然后去完成题目的要求
现在来开始吧~

第一题判断唯一字符

int book[110];
bool isUnique(char* astr)
{
    memset(book,0,sizeof(book));//初始化内存
    int flg=0;
    if(strlen(astr)<=1)//单个字符或者空串,直接正确
            return true;
    for(int i=0;astr[i];i++)//book标记字符出现的次数
    {
        book[astr[i]-'a']++;
        if(book[astr[i]-'a']==2)//当出现重复时,标记重复
            flg=1;
    }
    if(flg)//如果标记有重复 就返回false
        return false;
    return true;
    
}

第二题第一次出现一次的字符

主要问题是

怎么解决第一次出现的字符,既可以使用hash映射,

也有一个简单的方法就是,

1.按照输入的顺序遍历,每个字母标记出现的次序

2.还是按照顺序遍历,找到第一个出现次序为1的字符就是所求字符(自己思考一下,很巧妙)

这样就避免了使用hash映射的方法,

int  hash[256];
char firstUniqChar(char* s)
{
    int i, len = strlen(s);
    memset(hash, 0, sizeof(hash));

    for (i = 0; i < len; i++) 

        hash[s[i]]++;

    for (i = 0; i < len; i++) 
    {
        if (hash[s[i]] == 1) 
            return s[i];
    }
    return ' ';
}

第三题赎金信

很简单的思路,设置一个数组去记录每个字符出现的次数, 如果出现杂志中出现+1,用一个-1,直接遍历即可,不需要考虑顺序什么别的问题
核心还是用一个数组去储存ascll值 去标记字符出现次序
空间复杂度为O(N);

int hash[256]={0};//标记数组
bool canConstruct(char * ransomNote, char * magazine)
{
    memset(hash,0,sizeof(hash));//初始化内存
    int len1 = strlen(magazine);//分别求长度
    int len2 = strlen(ransomNote);//并且len2>=len1 
    for(int i=0;i<len1;i++)
    {
        hash[magazine[i]]++;//杂志中出现的+1
    }
    for(int i=0;i<len2;i++)
    {
        hash[ransomNote[i]]--;//需要一个就对该字符-1
    }
    for(int i=65;i<123;i++)
    {
        if(hash[i]<0)//只要有一个,就不可以
            return false;
    }
    return true;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值