LeetCode.1160-找到可以由给定字符组成的字符串(Find Words That Can Be Formed by Characters)
这是小川的第411次更新,第443篇原创
看题和准备
今天介绍的是LeetCode算法题中Easy级别的第262题(顺位题号是1160)。你会得到一个字符串单词数组和一个字符串chars
。如果字符串可以由字符中的字符组成(每个字符只能使用一次),则该字符串是好的。返回所有好的字符串的长度之和。
例如:
输入:words = ["cat","bt","hat","tree"],chars ="atach"
输出:6
说明:可以形成的字符串是"cat"和"hat",因此答案是3 + 3 = 6。
输入:words = ["hello","world","leetcode"],chars ="welldonehoneyr"
输出:10
说明:可以形成的字符串是"hello"和"world",因此答案是5 + 5 = 10。
注意:
1 <= words.length <= 1000
1 <= words[i].length , chars.length <= 100
所有字符串仅包含小写英文字母。
第一种解法
题目的意思是,给了一个由英文小写字母组成的字符串chars
,在字符串数组words
中,如果单词能够由chars
中的字符组成,那么此单词就是一个好单词。
我们直接翻译题目即可,将chars
理解成一个数组字典,每个字母出现的次数计数,变成一个26位长度的int
数组,接着去遍历words
中的单词,采用同样的原理,将单词每个字母当做字典数组的索引,出现一次就减1,如果字典数组中的元素值小于0,说明当前单词无法由chars
中的字母组成,结束本此循环,直到遍历完所有单词。
public int countCharacters(String[] words, String chars) {
// 获取字典数组
int[] dict = stringToIntegerArray(chars);
int sum = 0;
for (int i=0, len=words.length; i<len; i++) {
// 复制一份字典数组,为后面的减法做准备
int[] temp = dict.clone();
int len2 = words[i].length();
// 默认当前单词是好字符串
boolean flag = true;
for (int j=0; j<len2; j++) {
// 单词中的字母不在字典中,或超过使用次数
if (--temp[words[i].charAt(j)-'a'] < 0) {
flag = false;
break;
}
}
if (flag) {
sum += words[i].length();
}
}
return sum;
}
/**
* 将字符串转为长度为26的int数组
* @param s 字符串
* @return 长度为26的int数组
*/
public int[] stringToIntegerArray(String s) {
int[] arr = new int[26];
for (int i=0, len=s.length(); i<len; i++) {
arr[s.charAt(i)-'a']++;
}
return arr;
}
第二种解法
和第一种解法的思路类似,只是将第一种解法的数组复制替换成了另外一种写法,将当前单词也转为一个长度为26的int
数组,然后比较字典数组和单词数组元素值的大小,如果单词数组当前元素值大于字典数组当前元素值,则表示单词中的某些字母不在字典中或者出现次数超过了字典中的次数。
public int countCharacters2(String[] words, String chars) {
// 获取字典数组
int[] dict = stringToIntegerArray(chars);
int sum = 0, len = words.length, len2 = dict.length;
for (int i=0; i<len; i++) {
// 将单词也转为int数组
int[] temp = stringToIntegerArray(words[i]);
boolean flag = true;
for (int j=0; j<len2; j++) {
if (temp[j] > dict[j]) {
flag = false;
break;
}
}
if (flag) {
sum += words[i].length();
}
}
return sum;
}
/**
* 将字符串转为长度为26的int数组
* @param s 字符串
* @return 长度为26的int数组
*/
public int[] stringToIntegerArray(String s) {
int[] arr = new int[26];
for (int i=0, len=s.length(); i<len; i++) {
arr[s.charAt(i)-'a']++;
}
return arr;
}
小结
算法专题目前已更新LeetCode算法题文章268+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.1160-找到可以由给定字符组成的字符串(Find Words That Can Be Formed by Characters)的更多相关文章
- 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...
- Leetcode(3)无重复字符的最长子串
Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- 【leetcode】1160. Find Words That Can Be Formed by Characters
题目如下: You are given an array of strings words and a string chars. A string is good if it can be form ...
- 找到第N个字符
找到第N个字符 小黑黑上课的时候走神儿,鬼使神差的就想到了这么一个问题,假如: S1=a S2=ab S3=abc S4=abcd S26=abcdefghijklmnopqrstuvwxy ...
- 【LeetCode】1160. Find Words That Can Be Formed by Characters 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 日期 题目地址:https://leetco ...
- 剑指offer面试题48: 最长不含重复字符的子字符串
Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- Swift3.0语言教程查找字符集和子字符串
Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...
随机推荐
- 2.Locust 跑起来试试
代码 from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task def baidu(self): ...
- Python 基础知识 (1) 持续更新
(1)数字和表达式 当进入Python交互式的时候,Python就可以直接当成计算机使用 如 >>> 2 + 2 4 但是 当 1个整数 和 另外一个整数 相除的时候,计算的结果,只 ...
- 云主机用samba服务实现和windows共享文件
最近刚刚入坑了百度云的云主机BCC,准备在云主机上实现samba服务,映射到本机来当硬盘使用,可是一直怎么试都不成功,后来咨询客服之后才知道samba默认使用的端口445端口被运营商封禁了,只好更改端 ...
- 【leetcode】1296. Divide Array in Sets of K Consecutive Numbers
题目如下: Given an array of integers nums and a positive integer k, find whether it's possible to divide ...
- 【转】pe结构详解
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...
- addBack() 添加堆栈中元素集合到当前集合,一个选择性的过滤选择器。
addBack() 概述 添加堆栈中元素集合到当前集合,一个选择性的过滤选择器. 如上所述在讨论中的.end(), jQuery对象维护一个堆栈内部来跟踪匹配的元素集合的变化.当一个DOM遍历方法被调 ...
- 019_linuxC++之_函数模板引入
(一)首先我们来看非模板程序,函数只是输入不一样的变量就需要构件很多个不一样的函数,那么这样很麻烦,则引入函数模板 int& max(int& a, int& b) { ret ...
- Microsoft Enterprise Library 5.0 系列教程(四) Logging Application Block
Download dll: http://www.microsoft.com/en-us/download/confirmation.aspx?id=15104 http://www.cnblogs. ...
- HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
题目链接 题意 : 给定方格中第一行的各个起点.再给定最后一行与起点相对应的终点.问你从这些起点出发到各自的终点.不相交的路径有多少条.移动方向只能向下或向右 分析 : 首先对于多起点和多终点的不相交 ...
- 转:后置处理器JSON Extractor 提取json的多个值
json串 []表示对象组成的数组,{}表示对象. 对象里包含多个 "属性":属性值.属性值可以是值,或数组,或对象. JSON Extractor使用json path表达式匹配 ...