[解题报告](第24讲) 字符串算法(四) - 字符计数法(1)

简介: [解题报告](第24讲) 字符串算法(四) - 字符计数法

目录


零、写在前面


一、主要知识点


       1.字符记数


二、课后习题


面试题 01.01. 判定字符是否唯一


剑指 Offer 50. 第一个只出现一次的字符


383. 赎金信


771. 宝石与石头


面试题 01.02. 判定是否互为字符重排


1941. 检查是否所有字符出现次数相同


242. 有效的字母异位词


剑指 Offer II 032. 有效的变位词


1832. 判断句子是否为全字母句


2053. 数组中第 K 个独一无二的字符串


写在最后


零、写在前面


        这是打卡的第二十四天,今天题目好多好多啊,主要知识点在


《算法零基础100讲》(第24讲) 字符串算法(四) - 字符计数法

https://blog.csdn.net/WhereIsHeroFrom/article/details/121295716


一、主要知识点


       1.字符记数


       可以利用hash表来记录字符串的数量,如果字符串只包含小写字母,还可以进一步压缩。


int hash[26] ={0};    //hash表顺带初始化
    for(int i = 0;s[i];++i)
        hash[s[i] - 'a']++;    //统计数量

二、课后习题


面试题 01.01. 判定字符是否唯一


面试题 01.01. 判定字符是否唯一

https://leetcode-cn.com/problems/is-unique-lcci/

思路


利用hash表,扫到扫过的字母就直接返回假,如果全扫完也没遇到就返回真。


bool isUnique(char* astr){
    bool hash[256];
    memset(hash,0,sizeof(hash));
    for(int i = 0;astr[i];++i)
        if(!hash[astr[i]])  hash[astr[i]]++;
        else return false;
    return true;
}

结果分析

image.png


凑合玩玩


剑指 Offer 50. 第一个只出现一次的字符


剑指 Offer 50. 第一个只出现一次的字符

https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/

思路


先用hash表统计所有字母的出现次数,再扫描hash表,如果有等于1就的返回


没有就返回空格。


这道题返回的是一个字符!所以可以直接返回一个值!


char firstUniqChar(char* s){
    int hash[26] ={0};    //hash表+初始化
    for(int i = 0;s[i];++i)    //记录hash值
        hash[s[i] - 'a']++;
    for(int i = 0;s[i];++i)    //遍历hash表
        if(hash[s[i] - 'a'] == 1)   return s[i];
    return ' ';    //没找到返回空格
}

结果分析

image.png


说的过去


383. 赎金信


383. 赎金信

https://leetcode-cn.com/problems/ransom-note/

思路


这次其实只是更新hash表的方式不同


首先,扫描magazine将所有出现的元素和个数都插入hash表内


然后,扫描ransom,扫到一个字符将对应的hash表值减1.


bool canConstruct(char * ransomNote, char * magazine){
    int hash[256] = {0};    //hash表
    for(int i = 0;magazine[i];++i)//扫描magazine更新hash表
        hash[magazine[i]] ++;
    for(int i = 0;ransomNote[i];++i)    //扫描ransom更新hash表
        if(!hash[ransomNote[i]])  return false;//对应元素不够用?
        else hash[ransomNote[i]]--;
    return true;
}

结果分析

image.png


还是可以的


771. 宝石与石头


771. 宝石与石头

https://leetcode-cn.com/problems/jewels-and-stones/

思路


先扫描J中所有元素,然后根据hash表判断s中元素进行统计。


int numJewelsInStones(char * jewels, char * stones){
    bool has[256] = {0};    //hash表
    int ans = 0;
    for(int i = 0; jewels[i]; ++i)    //更新hash表
        if(has[jewels[i]] == 0) has[jewels[i]] = 1;
    for(int i = 0; stones[i]; ++i)//根据hash统计
        if(has[stones[i]] == 1) ans++;
    return ans;
}

结果分析

image.png


还可以的



相关文章
|
5月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
72 0
|
7月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
7月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
7月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
5月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
144 1
两个字符串匹配出最长公共子序列算法
|
5月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
198 0
|
7月前
|
搜索推荐 算法
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
|
5月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
7月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
8月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
448 1

热门文章

最新文章