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

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

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


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

https://leetcode-cn.com/problems/check-permutation-lcci/

思路


如果对应元素的个数相同,并且两个字符串长度相同贼满足条件。


bool CheckPermutation(char* s1, char* s2){
    int hash[256] = {0},count = 0;//hash表
    for(int i = 0;s1[i];++i){    //查看s1的所有元素
        hash[s1[i]]++;
        count++;
    }
    for(int i = 0;s2[i];++i){    //对比s2与s1中的元素是否相同
        if(hash[s2[i]])  hash[s2[i]]--;//找到了返回
        else return false;
        if(!(count--)) return false;
    }
    if(count == 0)return true;//长度相等
    else return false;    //s1比s2长
}

结果分析

image.png


很凑合了


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


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

https://leetcode-cn.com/problems/check-if-all-characters-have-equal-number-of-occurrences/

思路


先把所有元素出现的次数保存到hash表内,然后看hash表内非0元素是否与最大值相等。


bool areOccurrencesEqual(char * s){
    int max = 0,hash[26] = {0};//hash表和最大值的初始化
    for(int i = 0;s[i];++i){    //统计信息
        hash[s[i]-'a']++;
        if(hash[s[i]-'a'] > max) max = hash[s[i]-'a'];
    }
    for(int i = 0;i < 26;i++)    //看是否满足要求
        if(hash[i] && hash[i] != max)  return false;
    return true;
}

结果分析

image.png


凑合


242. 有效的字母异位词


242. 有效的字母异位词

https://leetcode-cn.com/problems/valid-anagram/

思路


分两步走。


先判断是否所有元素都有


再判断是否长度一样

bool isAnagram(char * s, char * t){
    int hash[26] = {0};
    for(int i = 0;s[i];++i)    //插入hash统计
        hash[s[i] - 'a']++;
    for(int i = 0;t[i];++i)    //看所有元素是否都够用
        if(hash[t[i] - 'a'])    hash[t[i]-'a']--;
        else    return false;
    for(int i = 0;i < 26;++i)
        if(hash[i]) return false;//hash表还有值说明长度不同
    return true;
}


结果分析

image.png


凑合玩玩


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


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

https://leetcode-cn.com/problems/dKk3P7/

思路


分两步走


统计每个字符出现的次数是否相同


判断是否长度相等或者是否完全相同


bool isAnagram(char * s, char * t){
    int hash[26] = {0};
    int ssize= 0,tsize = 0;
    for(ssize = 0;s[ssize];++ssize)//统计单词
        hash[s[ssize] - 'a']++;
    for(tsize = 0;t[tsize];++tsize)//查看单词是否出现次数相同
        if(hash[t[tsize] - 'a'])    hash[t[tsize]-'a']--;
        else    return false;
    if(ssize != tsize || !strcmp(s,t))   return false;    //长度是否相同 并且不完全相同
    return true;
}

解题思路

image.png


凑凑合和


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


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

https://leetcode-cn.com/problems/check-if-the-sentence-is-pangram/

思路


先用hash表统计所有出现的字母,


再全扫描hash表看是否有未出现的字母就好了呗?


bool checkIfPangram(char * sentence){
    char hash[26] = {0};
    for(int i = 0;sentence[i];++i)//查看出现的元素
        hash[sentence[i] - 'a'] = true;
    for(int i = 0;i < 26;i++)    //查看是否有未出现元素
        if(!hash[i])    return false;
    return true;
}

解题思路

image.png


海星


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


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

https://leetcode-cn.com/problems/kth-distinct-string-in-an-array/

思路


利用一个字符指针数组保存不一样的字符串


当扫描同样的字符的时候将对应的hashnum值+1


扫描整个hash表查找只出现一次的hashnum值,找到一个k-1,最终找到就返回对应hash值。找不到就返回一个申请的空字符串


char * kthDistinct(char ** arr, int arrSize, int k){
    int count = 0,ansnum = 0;
    char * hash[1000];    //收集不同的字符串
    int hashnum[1000]= {0};    //收集对应字符串出现次数
    for(int i = 0;i < arrSize;i++){    //扫描所有的arr进行hash和hashnum的插入
        int j = 0;
        for(j = 0;j < count;j++)
            if(strcmp(hash[j],arr[i]) == 0){//出现过
                hashnum[j] ++;
                break;
            }
        if(j == count) {        //未出现过
            hash[count++] = arr[i];
            hashnum[count - 1] ++;
        }
    }
    for(int i = 0,j = k;j > 0 && i < count;i++){    //寻找对应的字符串地址
        if(hashnum[i] == 1)j--;
        if(j == 0)  return hash[i];
    }
    char *s = malloc(sizeof(char));//空字符串 必须要申请
    s[0] = 0;
    return s;
}

结果分析

image.png


写完了,终于!


写在最后


不想待在寝室,大家一定要离床远一点。冬天了,大家注意保暖,别感冒了!


平板的win11还差个acpi 我得再修修,可算开机了,就是蓝屏,呜呜呜。

相关文章
|
1月前
|
算法
【优选算法】—— 字符串匹配算法
【优选算法】—— 字符串匹配算法
|
2月前
|
人工智能 算法 测试技术
【动态规划】【字符串】【C++算法】940. 不同的子序列 II
【动态规划】【字符串】【C++算法】940. 不同的子序列 II
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-246 算法训练 猴子吃包子
35 2
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-48 算法训练 关联矩阵
37 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
35 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-8 算法训练 操作格子 线段树
29 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-5 算法训练 最短路
24 0
|
2月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
32 1
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
38 1
|
2月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-7 算法训练 逆序对 平衡二叉树
34 0