拼写单词-哈希表


前言

   这道leetcode编程题是道简单题,本篇文章是对哈希表unordered_map使用的一个实例,并介绍代码的思路。

一、题目描述

   给你一份『词汇表』(字符串数组) 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。若某个单词的字符没有和哈希表中的字符相匹配或者某个单词中的字符和哈希表中的字符匹配上了,但是哈希表中相应字符的数量已经为0,则判定没有掌握这个单词,退出当前单词字符的遍历,进入词汇表中下一个单词字符的遍历。当某个单词的最后一个字符匹配上哈希表并且其对应字符的数量大于等于0,则判定已经掌握了这个单词,将这个单词的长度和之前掌握的单词长度之和相加。
   每次某个单词遍历完毕后,要恢复哈希表中字母表的字母数量。这样将词汇表中的所有单词遍历完毕后,返回掌握的单词长度之和即可。这里为了节省查找时间,所以字母表的字符数量我们选择用哈希表来存储,定义为unordered_map<string,int> model。

 

三、c++代码实现

话不多说,上代码:

 class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
         int size=words.size();  //获取词汇表的单词数
         unordered_map <char,int> model;
         int len=0;    //掌握的单词长度之和变量
         for(char c:chars){
           model[c]++;           //依次获取字母表的字符数
                          }
         unordered_map <char,int> temp=model;//temp才是进行匹配的实际字母表,model是模版
         for(int i=0;i<size;i++){
            string check;
            check=words[i];   //依次获取词汇表中的单词
            for(int i=0;i<check.length();i++){      //按单词顺序匹配字母表
                char letter=check[i];
                if(temp.find(letter)!=temp.end()&&temp[letter]>=0){//如果字符表匹配到单词表字符,字符表字母数--               
                     temp[letter]--;
                     if(i==check.length()-1&&temp[letter]>=0){   //如果匹配到最后一个字符,计算长度之和
                           len=len+check.length();
                                                              }
                     
                                                       }
                if(temp.find(letter)==temp.end()||temp[letter]<0){  //如果字符表没匹配到单词表字符或超出可匹配字符数,跳出当前循环
                      break;
                                                         }
            
                             }            
                temp=model;   //恢复字母表
            
                                }

         return len;
    }
};


 

总结

  以上就是这道题目本人的解题思路和代码实现,其实感觉自己这道题的代码实现有点复杂,当我看完leetcode题解后才知道原来只要比较词汇表中某个单词的字母和相应字母的数量与字母表中的字母和字母数量是否匹配即可,但是我在运行题解的代码的时候发现它的内存是我的一倍,可能是它用了两个哈希表的原因。但是不得不说,它的代码量是真的少。本篇文章中的代码一定也有可以改善和优化的部分,解题方法应该也有更简单的,大家如果有更好的思路或者改善代码的方法,欢迎在评论区留言,先溜了~~
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值