[解题报告](第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 我得再修修,可算开机了,就是蓝屏,呜呜呜。

相关文章
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
190 0
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
121 0
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
222 0
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
133 0
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
345 1
两个字符串匹配出最长公共子序列算法
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
990 1
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
414 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
708 0

热门文章

最新文章