题目描述
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
解题思路
判断第一个字符串能否由第二个字符串中的字符构造,第二个字符串中每个字母只能用一次。
最简单的方法,两个循环,时间复杂度为O(N),代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int a=ransomNote.size();
int b=magazine.size();
int visit[b];
for (int k=0; k<b; k++) {
visit[k]=0;
}
int count = 0;
for (int i=0; i< a ; i++) {
for (int j=0; j< b ; j++) {
if (magazine[j]==ransomNote[i]&&visit[j]==0) {
visit[j]=1;
count++;
break;
}
}
}
if (count==a) {
return true;
}
else
return false;
}
};
优化成O(n)的方法为,用一个长度为26的数组,记录magezine字符串中a-z每个字母出现的个数,再用这个个数不断减去ransomNote中相同字母的个数,当减到<0时,即返回false。
代码如下:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int a=ransomNote.size();
int b=magazine.size();
int letter_num[26]={0};
for (int i=0; i< b ; i++) {
letter_num[magazine[i]-'a']++;
}
for (int j=0; j< a ; j++) {
letter_num[ransomNote[j]-'a']--;
if (letter_num[ransomNote[j]-'a']<0) {
return false;
}
}
return true;
}
};