前言

这是五月集训打卡的第二天,今日的训练内容是 字符串 由于有很多还没有学习到的东西,今天的题目很多是根据题解来写的,因此今天的题目主要是以分析源代码的形式。

解题报告

1.力扣500

原题链接

https://leetcode-cn.com/problems/keyboard-row/

题目概述

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

第一行由字符 “qwertyuiop” 组成。
第二行由字符 “asdfghjkl” 组成。
第三行由字符 “zxcvbnm” 组成。

源码剖析

/*** Note: The returned array must be malloced, assume caller calls free().*/
char ** findWords(char ** words, int wordsSize, int* returnSize){*returnSize = 0;//初始化返回的容量if(words == NULL || wordsSize == 0){return NULL;}// 26个大写字母对应的行号,如Q在第1行//             A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Zint hash[26]= {2, 3, 3, 2, 1, 2, 2, 2, 1, 2, 2, 2, 3, 3, 1, 1, 1, 1, 2, 1, 1, 3, 1, 3, 1, 3};char **result = (char **)calloc(wordsSize, sizeof(char *));int i, j, len;int num = 0;//字符所在行号for(i = 0; i < wordsSize; i++){len = strlen(words[i]);if(len == 0) continue;num = hash[toupper(words[i][0]) - 'A']; //第一个字符的行号for(j = 1; j < len; j++){if(num != hash[toupper(words[i][j]) - 'A']){break;}}if(j == len){//单词所有字符在一行result[(*returnSize)++] = words[i];}}return result;
}

首先初始化容量,排除一下特殊情况(没有元素的时候),随后用一个哈希表将每一行的元素都定义起来(也就是每一个字母在键盘上的行数)
接下来对每一个单词进行遍历,只要有一个字母不在同一行之中都会直接 break ,如果没有出现过break的话,就将这个字符串填入返回数组中,并且容量加一。

2.力扣1160

原题链接

https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/

题目概述

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和。

解题思路

使用哈希表来记录下所给的字母表中的每个字母分别有多少个,每出现一次就在其对应的位置的值加一,然后对所给的词汇遍历,一旦当某个字母出现次数大于哈希表中的对应字母的数字,则不符合要求,然后累加符合要求的词汇的长度的总和返回即可。

源码剖析

int countCharacters(char ** words, int wordsSize, char * chars){int nums = strlen(chars);if (wordsSize == 0 || nums == 0) return 0;                               //词汇表或者字母表为0都不可int max = 0, j = 0;int map[26], count[26];                     //hash表 与 计数数组memset(map, 0, sizeof(map));                //hash表初始化for (int c = 0; c < nums; c++) {            //生成hash值,一个字母如果出现一次,计数就加一map[chars[c] - 'a']++;}for (int i = 0; i < wordsSize; i++) {int len = strlen(words[i]);if (len > nums) continue;               //单个word长度超过字母表长度,无效memset(count, 0, sizeof(count));        //计数数组归零for (j = 0; j < len; j++) {if (map[words[i][j] - 'a'] <= count[words[i][j] - 'a']) break; //hash值为0 或 重复字母不足count[words[i][j] - 'a']++;         //计数+1,代表字母重复一次}if (j == len) max += len;               //当上面循环有break存在时,无效}return max;
}

详细见解题思路与代码注释

3.力扣1047

原题链接

https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/

题目概述

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

源码剖析

char * removeDuplicates(char * S){int len = strlen(S);char *ret = (char*)malloc(sizeof(char)*(len + 1));      //这边len+1是因为要多一个用来存储'\0'的位置int retSize = 1;ret[0] = S[0];for(int i=1; i<len; i++){if(retSize > 0 && ret[retSize-1] == S[i]){retSize--;}else{ret[retSize++] = S[i];}}ret[retSize] = '\0';                                    //最后一个位置存入结束符号'\0'return ret;}

这是题解,等学习完栈的知识之后就立刻回来重刷这道题。

4.力扣1935

原题链接

https://leetcode-cn.com/problems/maximum-number-of-words-you-can-type/

题目概述

键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。

给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入的 text 中单词的数目。

源码剖析

int canBeTypedWords(char * text, char * brokenLetters){int hash[26]={0,};for(int i=0;i<strlen(brokenLetters);i++){hash[brokenLetters[i]-'a']++;}int n=strlen(text),count=0,flag=0;for(int i=0;i<n;i++){if(text[i]==' '&&flag==0){count++;}if(text[i]==' '&&flag==1){flag=0;}if(text[i]!=' '&&hash[text[i]-'a']!=0){flag=1;}if(i==n-1&&flag==0){count++;}}return count;
}

题解,计划一个星期以后回来重刷

《五月集训》第二日——字符串相关推荐

  1. 英雄算法联盟---五月集训总结

    目录 1. 知识星球英雄算法联盟 2.训练历程与感悟 3.加入星球的变化 4.未来目标 5.结尾 tips:想加入星球的小伙伴可以扫描下方的二维码,加入星球后可以找我返现! 1. 知识星球英雄算法联盟 ...

  2. C++实现输入两个字符串,从第一字符串中删除第二个字符串中所有的字符

    一定要注意一点就是: char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的 而char p[]是一个数组,已经分 ...

  3. SQL Server(第二章) 字符串函数、日期时间函数、转换函数

    --1.CONCAT 函数:字符串连接(支持sql server2012 SQL规则 如果与NULL连接返回NILL) SELECT empid,CONCAT(firstname,lastname) ...

  4. [笔试面试][code_by_hand]输出第二个字符串在第一个字符串中的连接次序

    1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace st ...

  5. Java黑皮书课后题第4章:4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串

    4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串 题目 题目概述 运行示例 破题:String方法.属性的使用 代码 题目 题目概述 4.22(检测子 ...

  6. 比较第一与第二个字符串,是否有连续的5个字符相同.sql

    --比较第一与第二个字符串,是否有连续的5个字符相同,如果有,返回1,否则返回0 if exists (select * from dbo.sysobjects where id = object_i ...

  7. 神州数码否认买下华为荣耀,股价连续第二日涨停,创历史新高!

    11月11日消息,神州数码早间发布公告称,截至本公告披露日,神州数码与华为未就荣耀出售一事达成任何协议. 神州数码公司在公告中表示,公司关注到,11月10日,部分媒体以"华为计划以1000亿 ...

  8. Python按元组中第一个字符串升序第二个字符串降序排序

    问题描述:假设有一个列表,里面包含若干元组,每个元组中有两个字符串,现在要求对列表中的元组进行排序,排序规则为:第一个字符串升序,如果第一个字符串相同则按第二个字符串降序. 参考代码: 运行结果: - ...

  9. 【活动回顾】上海区块链开发者大会(2021)第二日精彩回顾

    活动时间:2021年11月13日至14日 活动主办方:中国人民大学区块链研究院.上海可一澈科技有限公司.CSDN 大会首日精彩回顾 上海区块链开发者大会(2021)第二天的活动于11月14日星期日拉开 ...

  10. 题解报告(CDUT暑期集训——第二场)

    题解报告(CDUT暑期集训--第二场) D - Game HDU - 6312 思路:水题 Alice一直是必胜态 AC代码 #include<stdio.h> #include<i ...

最新文章

  1. 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
  2. QUIC实战(一) 通过Quiche部署支持HTTP3 的NGINX
  3. SAS在金融中的应用一
  4. Pytorch —— 权值初始化
  5. 深度学习最常用的学习算法:Adam优化算法
  6. Chronometer控件实现的Android计时器
  7. 大数据分析的处理流程
  8. python — 二手房
  9. 机器学习5——决策树
  10. 实战录 | Spring中bean的生命周期
  11. vue开发项目微信公众号授权支付开发
  12. 计算机网络的分类 ppt,计算机网络的分类.ppt
  13. 计及需求侧响应日前、日内两阶段鲁棒备用优化【IEEE6节点】(Matlab代码实现)
  14. 冯小刚说公众人物只能骂不还口打不还手,这是当明星要承担的代价
  15. 如何查看网页上的密码
  16. oracle12c命令行安装grid,oracle12c-RAC安装部署之GRID安装-grid设置
  17. 计算机所有服务都无法启动,依赖服务或组无法启动,详细教您这样解决依赖服务或组无法启动...
  18. 深入理解MySQL学习记录
  19. SpringMVC mybatis SSM 多数据源 java redis shiro 代码生成器
  20. Java编程之路相关书籍(三个维度)

热门文章

  1. 概率论与数理统计公式
  2. ldc java_DMD与GDC与LDC的比较
  3. NXP IMX8系列应用处理器介绍
  4. 达梦数据库在ZYJ环境上通过RPM打包注册服务的步骤
  5. python爬虫——百度文本审核技术
  6. Flow-Guided-Feature-Aggregation-的安装配置,demo运行,以及采用少量ILSVRC2015 VID数据集在其中训练
  7. P5.js创意自画像编程
  8. Percent百分比布局用法
  9. LowB三人组--选择排序原理和实现
  10. android追美剧app,追美剧必备神器!安卓追剧助手App体验