leetcode1160:拼写单词

题目的意思很简单,就是要看字母表字符串能否拼出单词,能拼出就把单词的字母大小加上。

比较坑的是,每次拼写,字母表中的每个字符只能用一次,不然的话可以用find函数,循环遍历的时候find一下看该字符串在不在字母表里就行了。

每个字符只能用一次,这意味着要么你记录这个字符用没用过,要么你先记录单词的数量,然后用一次减一次。

这里使用了哈希法,把字母表字符串的个数记录下来。然后循环遍历,每次遇到个数为0的数就退出(字母不够用了),遇到个数不为0则减1。

由于在一次遍历中,map被操作过,故遍历完这个词后,重新赋值初始map,保证每次字母表字符串都和原始一样。

int countCharacters(vector<string>& words, string chars)
{
    int num = 0;
    map <char, int> mymap,mymap2;

    for(int i = 0; i < chars.size(); i++)
    {
        mymap[chars[i]] ++;
    }
    mymap2 = mymap;
    for(int i = 0; i < words.size(); i ++)
    {
          for(int j = 0; j < words[i].size(); j ++)
          {
               if(string::npos == chars.find(words[i][j]))
               {
                   break;
               }//在a中查找b
               // 如果等于0,等于说已经没这个字母了
               mymap[words[i][j]] ==0 ? (j = words[i].size()) :(mymap[words[i][j]]--) ;
               if(j == words[i].size()-1)
               {
                num += words[i].size();
               }
          }
          mymap = mymap2;
    }
    return num;
}
发布了51 篇原创文章 · 获赞 52 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hanghang_/article/details/104932591