《五月集训》第二日——字符串
前言
这是五月集训打卡的第二天,今日的训练内容是 字符串 由于有很多还没有学习到的东西,今天的题目很多是根据题解来写的,因此今天的题目主要是以分析源代码的形式。
解题报告
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. 知识星球英雄算法联盟 2.训练历程与感悟 3.加入星球的变化 4.未来目标 5.结尾 tips:想加入星球的小伙伴可以扫描下方的二维码,加入星球后可以找我返现! 1. 知识星球英雄算法联盟 ...
- C++实现输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
一定要注意一点就是: char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,你在下面给他赋值肯定是错的 而char p[]是一个数组,已经分 ...
- SQL Server(第二章) 字符串函数、日期时间函数、转换函数
--1.CONCAT 函数:字符串连接(支持sql server2012 SQL规则 如果与NULL连接返回NILL) SELECT empid,CONCAT(firstname,lastname) ...
- [笔试面试][code_by_hand]输出第二个字符串在第一个字符串中的连接次序
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace st ...
- Java黑皮书课后题第4章:4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串
4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串 题目 题目概述 运行示例 破题:String方法.属性的使用 代码 题目 题目概述 4.22(检测子 ...
- 比较第一与第二个字符串,是否有连续的5个字符相同.sql
--比较第一与第二个字符串,是否有连续的5个字符相同,如果有,返回1,否则返回0 if exists (select * from dbo.sysobjects where id = object_i ...
- 神州数码否认买下华为荣耀,股价连续第二日涨停,创历史新高!
11月11日消息,神州数码早间发布公告称,截至本公告披露日,神州数码与华为未就荣耀出售一事达成任何协议. 神州数码公司在公告中表示,公司关注到,11月10日,部分媒体以"华为计划以1000亿 ...
- Python按元组中第一个字符串升序第二个字符串降序排序
问题描述:假设有一个列表,里面包含若干元组,每个元组中有两个字符串,现在要求对列表中的元组进行排序,排序规则为:第一个字符串升序,如果第一个字符串相同则按第二个字符串降序. 参考代码: 运行结果: - ...
- 【活动回顾】上海区块链开发者大会(2021)第二日精彩回顾
活动时间:2021年11月13日至14日 活动主办方:中国人民大学区块链研究院.上海可一澈科技有限公司.CSDN 大会首日精彩回顾 上海区块链开发者大会(2021)第二天的活动于11月14日星期日拉开 ...
- 题解报告(CDUT暑期集训——第二场)
题解报告(CDUT暑期集训--第二场) D - Game HDU - 6312 思路:水题 Alice一直是必胜态 AC代码 #include<stdio.h> #include<i ...
最新文章
- 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★
- QUIC实战(一) 通过Quiche部署支持HTTP3 的NGINX
- SAS在金融中的应用一
- Pytorch —— 权值初始化
- 深度学习最常用的学习算法:Adam优化算法
- Chronometer控件实现的Android计时器
- 大数据分析的处理流程
- python — 二手房
- 机器学习5——决策树
- 实战录 | Spring中bean的生命周期
- vue开发项目微信公众号授权支付开发
- 计算机网络的分类 ppt,计算机网络的分类.ppt
- 计及需求侧响应日前、日内两阶段鲁棒备用优化【IEEE6节点】(Matlab代码实现)
- 冯小刚说公众人物只能骂不还口打不还手,这是当明星要承担的代价
- 如何查看网页上的密码
- oracle12c命令行安装grid,oracle12c-RAC安装部署之GRID安装-grid设置
- 计算机所有服务都无法启动,依赖服务或组无法启动,详细教您这样解决依赖服务或组无法启动...
- 深入理解MySQL学习记录
- SpringMVC mybatis SSM 多数据源 java redis shiro 代码生成器
- Java编程之路相关书籍(三个维度)