这是小川的第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. loj515 「LibreOJ β Round #2」贪心只能过样例[bitset+bool背包]

    由于bitset极其不熟练且在实际题目中想不起来运用它来优化,于是练了几道题. 这题是一个分组的bool背包,每组必须选一个,暴力的话是$O(n^5)$. 如果dp数组不要一维滚动的话,有两种枚举方法 ...

  2. docker学习系列-jdk基础镜像制作

    准备一台安装有docker服务的机器 1.编辑Dockerfile   vim Dockerfile FROM centos:latest ADD ./jdk-8u141-linux-x64.tar. ...

  3. Eclipse断点种类

    本文是Eclipse调试(1)——基础篇 的提高篇.分两个部分: 1) Debug视图下的3个小窗口视图:变量视图.断点视图和表达式视图 2) 设置各种类型的断点 变量视图.断点视图和表达式视图 1. ...

  4. oracle split函数

    PL/SQL 中没有split函数,需要自己写. 代码: ); --创建一个 type ,如果为了使split函数具有通用性,请将其size 设大些. --创建function create or r ...

  5. zuul网管配置其他服务时 HTTP Status 500 – Internal Server Error

    1.这个错误是由三个原因导致的 (1).我在给类的接口命名的时候前面少加了一个/ (2)给zuul配置路由的时候多加了个服务名,serviceId名称就是spring的name,而不是eureka注入 ...

  6. MFC 下拉框Combo Box

    下拉框常用的事件是Change事件.属性常用:Data(英文;分隔),Sort(是否排序) // OnInitDialog()中 m_cbx.SetCurSel();//设置默认选项 //OnBnCl ...

  7. luogu 2279 [HNOI2003]消防局的设立 树形dp

    就是细节多一些,思路都非常常规. Code: #include <bits/stdc++.h> #define N 1005 #define inf 1061109567 #define ...

  8. 51 Nod 1449 砝码称重

    1449 砝码称重  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1, ...

  9. Go位运算

    目录 &(AND) |(OR) ^(XOR) &^(AND NOT) << 和 >> & 位运算 AND | 位运算 OR ^ 位运算 XOR & ...

  10. python 二维数组 转 矩阵

    x = numpy.array([[,,],[,,],[,,]]) print x print x.shape 输出 [[ ] [ ] [ ]] (3L, 3L) [Finished .2s]