您的位置:首页 > 其它

LeetCode解题报告 383. Ransom Note [easy]

2016-12-23 01:05 477 查看

题目描述

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;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode