LeetCode383 赎金信 带输入和输出

题目: 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = “a”, magazine = “b”
输出:false

示例 2:

输入:ransomNote = “aa”, magazine = “ab”
输出:false

示例 3:

输入:ransomNote = “aa”, magazine = “aab”
输出:true

思路:magazine中的字母不能重复使用,假设字符串中只有小写字母。暴力法:首先遍历magazine的字符串,从第一个开始,看是不是有对应的ransomNote 字符串中中的同样的字符,如果有,将ransomNote 字符串该处的字符设为字符0,最后判断ransomNote 字符串中是不是全是字符0。哈希法:首先判断两个字符串的长度,如果ransomNote 的字符串长度大于magazine 字符串长度,那么就不用比较了,否则,将magazine 字符串遍历,存到数组中,给对应数组位置减去字符a,表示存放的位置,再++表示存放了几个这样的字符,最后将ransomNote 字符串以同样的方式进行–的操作,没执行一步判断是不是减为了负数,如果没有返回true。

暴力法:

bool selectfun(string ransomNote, string magazine) {

	for (int i = 0; i < magazine.size();i++) {
		for (int j = 0; j < ransomNote.size();j++) {
			if (magazine[i] == ransomNote[j]) {
				ransomNote[j] = '0';
				break;
			}
		}
	}
	for (int i = 0; i < ransomNote.size();i++) {
		if (ransomNote[i] != '0') {
			return false;
		}
	}
	return true;
}

int main() {
	string ransomNote = "ab";
	string magazine = "b";

	cout<<selectfun(ransomNote, magazine)<<endl;
	return 0;
}

哈希法:

bool selectfun(string ransomNote, string magazine) {
	int record[26] = { 0 };
	if (ransomNote.size()>magazine.size()) {
		return false;
	}
	for (int j = 0; j < magazine.size(); j++) {
		record[magazine[j] - 'a']++;
	}
	for (int i = 0; i < ransomNote.size();i++) {
		record[ransomNote[i]-'a']--;
		if (record[ransomNote[i] - 'a']<0) {
			return false;
		}
	}
	return true;
}

int main() {
	string ransomNote = "ab";
	string magazine = "aaab";
	cout<<selectfun(ransomNote, magazine)<<endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值