Leetcode -383.赎金信
题目:给你两个字符串: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
我们的思路是,创建两个数组并初始化为0,将两个字符串中的元素分别作为这两个数组的下标记录它们出现的次数,最后比较它们的出现次数的关系;下面看代码以及注释:
bool canConstruct(char* ransomNote, char* magazine) { //创建两个数组并初始化为0 int hash[26] = { 0 }; int tmp[26] = { 0 }; //hash数组以ransomNote的元素减去'a'作为下标,每次相同的元素累加起来 for (int i = 0; i < strlen(ransomNote); i++) { hash[ransomNote[i] - 'a'] += 1; } //tmp数组以magazine的元素减去'a'作为下标,每次相同的元素也累加起来 for (int i = 0; i < strlen(magazine); i++) { tmp[magazine[i] - 'a'] += 1; } //最后比较这两个数组,在26个字母范围内, //如果是相同的字母,在hash数组中存放的个数大于tmp数组中的个数,就返回false //因为要使magazine这个字符串中的元素可以组成ransomNote这个字符串, //那么tmp数组中的以magazine字符串的元素作为下标的元素个数必须要大于hash数组中的 for (int i = 0; i < 26; i++) { if (hash[i] > tmp[i]) { return false; } } //如果前面没有返回,就返回true return true; }
Leetcode - 387.字符串中的第一个唯一字符
题目:给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 - 1 。
示例 1:
输入 : s = “leetcode”
输出 : 0
示例 2 :
输入 : s = “loveleetcode”
输出 : 2
示例 3 :
输入 : s = “aabb”
输出 : -1
我们的思路是,创建一个数组并初始化为0,以s字符串中的元素s[ i ]作为这个数组的下标,记录每个元素出现的次数;然后检查数组以s[ i ]为下标第一次等于1的位置,返回 i 这个位置即可;
int firstUniqChar(char* s) { //创建一个hash数组并初始化为0 int hash[26] = { 0 }; //以s字符串中的元素s[i]作为hash数组的下标,记录s[i]出现的次数 for (int i = 0; i < strlen(s); i++) { hash[s[i] - 'a'] += 1; } //检查数组以s[i]为下标第一次等于1的位置,返回i即可 for (int i = 0; i < strlen(s); i++) { if (hash[s[i] - 'a'] == 1) { return i; } } //没有即返回-1 return -1; }