这是小川的第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)的更多相关文章

  1. 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

    在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"LX"替换一个"XL ...

  2. Leetcode(3)无重复字符的最长子串

    Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果: ...

  3. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  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 ...

  5. 找到第N个字符

    找到第N个字符 小黑黑上课的时候走神儿,鬼使神差的就想到了这么一个问题,假如: S​1=a S​2=ab S​3=abc S​4=abcd S​26=abcdefghijklmnopqrstuvwxy ...

  6. 【LeetCode】1160. Find Words That Can Be Formed by Characters 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 日期 题目地址:https://leetco ...

  7. 剑指offer面试题48: 最长不含重复字符的子字符串

    Given a string, find the length of the longest substring without repeating characters.(请从子字符串中找出一个最长 ...

  8. 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...

    37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...

  9. Swift3.0语言教程查找字符集和子字符串

    Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...

随机推荐

  1. flutter 项目中打印原生安卓的log信息

    因为项目的需要 在flutter 中调用安卓的方法 再用安卓的方法去调用c写的so包 方法 如果当前项目下面没有android stduio 自带的logcat  那就利用下面的方法 在安卓代码中引入 ...

  2. 218多校第九场 HDU 6424 (数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6424 题意:定义f(A) = log log log log …. (A个log) n ,g[A,B, ...

  3. vue_03总结

    vue_03总结 1.组件: html.css.js的集合体 vue实例就代表组件 组件用template实例成员管理html结构,有且只有一个根标签 子组件可以复用,所以数据要组件化处理,data的 ...

  4. binlog2sql闪回工具的使用

    binlog2sql闪回工具的使用 一.下载安装依赖的python yum install openssl-devel bzip2-devel expat-devel gdbm-devel readl ...

  5. jQuery+masonry实现瀑布流

    增加jQuery组件 <script src="//cdn.bootcss.com/jquery/2.2.1/jquery.min.js "></script&g ...

  6. HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5

    JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...

  7. 编码问题2 utf-8和Unicode的区别

    utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念 要想先讲清楚他们的区别,首先应该讲讲Unicode的来由. 众所周知 ...

  8. Java面向对象1(A~F)

    QWQ请假一节课,错过一章内容,只能求助qsh了. C/C++训练1---最大公约数与最小公倍数(SDUT 1131) import java.util.*; class Number { int a ...

  9. vue子组件通知父组件使用方法

    vue子组件通知父组件使用方法 <template> <mt-field placeholder="验证码" v-model="getverifycod ...

  10. idea2018.3.2版本如何破解

    IntelliJ IDEA2018破解教程(2019.1.11更新)破解方法:下载破解补丁→修改配置文件→输入激活码→激活成功 由于JetBrains封杀,大部分激活服务器已经不能使用,使用下面的比较 ...