(61)判断句子是否为全字母句 (62)宝石与石头

文章介绍了如何通过C语言实现两个编程题目:判断字符串是否为全字母句(pangram)和计算石头中宝石的数量。作者运用了哈希集合(数组)来跟踪字符出现情况,展示了高效的解题思路和代码实现。
摘要由CSDN通过智能技术生成


1. 每日一言

世界微尘里,吾宁爱与憎。


2. 题目

题目链接:判断句子是否为全字母句

全字母句 指包含英语字母表中每个字母至少一次的句子。

给你一个仅由小写英文字母组成的字符串 sentence ,请你判断 sentence 是否为 全字母句 。

如果是,返回 true ;否则,返回 false 。

  • 示例 1:
    输入:sentence = “thequickbrownfoxjumpsoverthelazydog”
    输出:true
    解释:sentence 包含英语字母表中每个字母至少一次。

  • 示例 2:
    输入:sentence = “leetcode”
    输出:false

提示:
1 <= sentence.length <= 1000
sentence 由小写英语字母组成

与这一题有点类似:使用C语言统计一个字符串中每个字母出现的次数


3. 解题思路

  1. 使用 calloc 函数为大小为26的整数数组 arr 分配内存空间,并将所有元素初始化为0。这个数组的每个位置对应字母表中的一个字母,用于记录该字母是否在句子中出现过。
  2. 新建一个 count 变量并初始化为0,用于计数句子中出现的不同字母的数量。
  3. 通过 for 循环遍历给定句子中的每个字符,直到遇到字符串的结尾标志 \0。
  4. 在循环中,代码将当前字符转换为对应的字母表索引,即 sentence[i] - ‘a’,并通过比较当前位置的值来判断该字母是否在句子中出现过。如果当前字母在之前的遍历中还未出现过,则将其标记为已出现,并将计数器 count 增加1。
  5. 完成遍历后,如果 count 的值为26,即所有字母都至少出现了一次,则返回 true 表示给定句子是一个完美的pangram。
  6. 如果 count 的值不为26,即不是所有字母都至少出现一次,则返回 false。

4. 代码

bool checkIfPangram(char* sentence) {
    int* arr = (int*)calloc(26,sizeof(int));//用来记录字母是否出现过
    int count = 0;//用来计数
    for(int i = 0; sentence[i] != '\0'; i++) {
        if(arr[sentence[i]-'a'] == 0) {
            arr[sentence[i]-'a'] = 1;
            count++;
        }
    }
    if(count == 26) {
        return true;
    }
	
	free(arr);
    return false;
}

5. 题目

题目链接:宝石与石头

给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 “a” 和 “A” 是不同类型的石头。

  • 示例 1:
    输入:jewels = “aA”, stones = “aAAbbbb”
    输出:3
  • 示例 2:
    输入:jewels = “z”, stones = “ZZ”
    输出:0

提示:
1 <= jewels.length, stones.length <= 50
jewels 和 stones 仅由英文字母组成
jewels 中的所有字符都是 唯一的


6. 解题思路

  1. 首先,使用 calloc 函数为 bool 类型的数组 arr 分配具有 58 个元素的空间,并将所有元素初始化为 false。这个数组用于记录哪些字母是珠宝字符。

  2. 然后,通过 for 循环遍历字符串 jewels 中的每个字符。在循环中,如果 arr[jewels[i]-‘A’] 的值是 false,表示该字符未被标记为珠宝字符,于是将其标记为 true。这一步骤遍历完后,arr 数组会记录下 jewels 中所有不同的字符。

  3. 接下来,代码初始化了一个整型变量 sum 为 0,用来存储包含在 stones 中的珠宝字符的数量。

  4. 再次使用 for 循环遍历 stones 中的每个字符。如果 arr 数组中对应位置的值为 true,说明该字符为珠宝字符,将 sum 的值增加 1。

  5. 最后,函数返回变量 sum 的值,即为在字符串 stones 中出现的属于字符串 jewels 的字符个数。

7. 代码

int numJewelsInStones(char* jewels, char* stones) {
    bool *arr = (bool*)calloc(58,sizeof(bool)); 
    for(int i = 0; jewels[i] != '\0'; i++) {
        if(arr[jewels[i]-'A'] == false) {
            arr[jewels[i]-'A'] = true;
        }
    }
    int sum = 0;
     for(int i = 0; stones[i] != '\0'; i++) {
        if(arr[stones[i]-'A']) {
            ++sum;
        }
    }
    free(arr);
    return sum;
}

8. 结语

这两个题是类似的,可以用哈希集合的方法来解决。

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值