383. Ransom Note

来源:互联网 发布:吉林广电网络集团 编辑:程序博客网 时间:2024/06/06 05:12

Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.

Each letter in the magazine string can only be used once in your ransom note.

Note:

You may assume that both strings contain only lowercase letters.

canConstruct("a", "b") -> falsecanConstruct("aa", "ab") -> falsecanConstruct("aa", "aab") -> true

思路:

第一个想到的是将magazine的字母存入堆中,每次将note中的字母取出来找到magazine然后删除,找不到时返回false

但这样每次都会遍历一遍堆,所以采用牺牲空间,直接用map的方法,magazine映射到的单元加一,note的减一,这样时间效率变高

class Solution {public:    vector<int> findAnagrams(string s, string p) {        vector<int> pv(256,0), sv(256,0), res;        if(s.size() < p.size())           return res;        for(int i = 0; i < p.size(); ++i)        {            ++pv[p[i]];            ++sv[s[i]];        }        if(pv == sv)           res.push_back(0);        for(int i = p.size(); i < s.size(); ++i)        {            ++sv[s[i]];            --sv[s[i-p.size()]];            if(pv == sv)               res.push_back(i-p.size()+1);        }        return res;    }};


原创粉丝点击