发布于2020-03-18 11:01 阅读(510) 评论(0) 点赞(3) 收藏(4)
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars 中的每个字母都只能用一次。
每个字典中的每个字符
返回词汇表 words 中你掌握的所有单词的 长度之和。
示例 1:
输入:words = [“cat”,“bt”,“hat”,“tree”], chars = “atach”
输出:6
解释:
可以形成字符串 “cat” 和 “hat”,所以答案是 3 + 3 = 6。
示例 2:
输入:words = [“hello”,“world”,“leetcode”], chars = “welldonehoneyr”
输出:10
解释:
可以形成字符串 “hello” 和 “world”,所以答案是 5 + 5 = 10。
提示:
1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
所有字符串中都仅包含小写英文字母
思路:使用长度为26的数组记录各字符数量,依次对字符进行对比,使用26的前提是字符串仅包含26个英文字符,如果有其它字符,需要扩大长度,比如256(全部ascii)。相同的思路也可以使用HashTable(字典)的方式实现,即使用字符作为Key,字符个数作为Value,只是在对比前使用ContainsKey进行预判断。
public class Solution {
// author: suoxd123@126.com
public void CounterString(string str, int[] arr)
{//统计字符串中每个字符的个数
Array.Clear(arr,0,arr.Length);
foreach(char item in str)
{
arr[item - 'a'] ++;
}
}
public int CountCharacters(string[] words, string chars) {
int result = 0;
int[] arrChar = new int[26], arrWord = new int[26];
CounterString(chars,arrChar);
foreach(string word in words)
{
bool flag = true;
CounterString(word,arrWord);
for(int i=0;i<26;i++)
{//对每个字符进行对比
if(arrWord[i] > arrChar[i])
{
flag = false;
break;
}
}
if(flag)
{//如果全部字符满足条件,则累加
result += word.Length;
}
}
return result;
}
}
思路:原理跟解法二一样,不过利用python的库函数Counter,来对原字符串进行统计:
class Solution:
# author: suoxd123@126.com
def countCharacters(self, words: List[str], chars: str) -> int:
dc = collections.Counter(chars)
cnt = 0
for w in words:
dw = collections.Counter(w)
cnt += len(w) if all([v<=dc[k] for k,v in dw.items()]) else 0
return cnt
思路:暴力法就是最直接的思路,直接使用words去跟字典中元素进行对比,每次对比完清除对比字符。
public class Solution {
// author: suoxd123@126.com
public int CountCharacters(string[] words, string chars) {
int result = 0;
foreach(string word in words)
{
char[] arrWord = word.ToCharArray();
char[] arrChar = chars.ToCharArray();
bool flag = true;
foreach(char item in arrWord)
{
int idx = Array.IndexOf(arrChar,item);
if(idx < 0)
{//不存在时候退出
flag = false;
break;
}
arrChar[idx] = '#';//清除原字符
}
if(flag)
{//如果全部字符满足条件,则累加
result += word.Length;
}
}
return result;
}
}
作者:战天
链接:https://www.pythonheidong.com/blog/article/265228/1d92f0515d453ff9c79a/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!