Difficulty:easy
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") -> false canConstruct("aa", "ab") -> false canConstruct("aa", "aab") -> true解题思路:
题目要求找到从一个string类型的字符串变换到另一个string字符串,而要完成变换,只能是字符串增加一个字母,而不能是将一个字母变成另外一个,所以可以利用一个对应于字母的ASCII码表的数组,对于第一个字符串,进行一次循环,每次都将字母对应数组中位置的值增加一。之后在进行一次循环,将第二个字符串中的字母对应在数组中的位置减一。
完成操作后,如果数组中出现了正数,说明第一个字符串中某个字母比第二个字符串多,需要删去某个字母才能完成变换,所以是不可行的。
那么最终需要对数组处理的就是通过一次循环判断是否有正数出现。
代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
char r;
int arr[500];
for(int i=0;i<500;i++) arr[i]=0;
for(int i=0;i<ransomNote.size();i++) arr[ransomNote[i]]=arr[ransomNote[i]]+1;
for(int i=0;i<magazine.size();i++) arr[magazine[i]]=arr[magazine[i]]-1;
bool answer=true;
for(int i=0;i<500;i++)
{
if(arr[i]>0) answer=false;
}
return answer;
}
};