力扣新手村题
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
例子:
输入:ransomNote = "a", magazine = "b"
输出:false
输入:ransomNote = "aa", magazine = "aab"
输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote
和magazine
由小写英文字母组成
方法一:暴力解决
通过两个循环来进行解决:通过对ransomNote的每个元素跟magazine进行对比,如果遇到相等的就直接令magazine[i] = ' ',记录一个相等count++,等循环结束,count的个数如果等于ransomNote的字符串数,则返回true,否则返回false。
bool canConstruct(char* ransomNote, char* magazine) {
int x = strlen(ransomNote);
int y = strlen(magazine);
int i = 0;
int j = 0;
int count = 0;
if (x > y)
{
return 0;
}
else {
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (ransomNote[i] == magazine[j])
{
magazine[j] = ' ';
count++;
break;
}
}
}
if (count == x) {
return 1;
}
else {
return 0;
}
}
}
注:bool函数只有C++有,而c语言是_Bool,而_Bool返回的只能是0或者非0的整数。
第二种:根据提示,两个变量的字符都为小写字母,通过建立一个数组a,通过magazine跟a进行ASCII码的相减,会得到一个整数n,然后让数组a[n]++,扫描完后再对ransomNode跟a进行ASCII码的相减,得到另一个整数m,让数组a[m]--。
通过两轮的扫描,a数组中存有一组数,如果有小于0的元素,说明ransomNode中有magazine没有的元素,则返回false,否则返回ture。
bool canConstruct(char * ransomNote, char * magazine){
int a[26] = { 0 };
int x = strlen(ransomNote);
int y = strlen(magazine);
for (int i = 0; i < y; i++)
{
a[magazine[i] - 'a']++;
}
for (int i = 0; i < x; i++)
{
a[ransomNote[i] - 'a']--;
}
for(int i = 0;i<26;i++){
if (a[i] < 0) {
return false;
}
}
return true;
}
暂时只能做这两种比较简单的思想,后期学到哈希表再回来对比。