2021-03-09

赎金信

    • 赎金信
    • 1. 示例
    • 2. 解题思路
    • 3.代码展示及分析
    • 4. auto命令解析
    • 5. 运行结果

赎金信

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

1. 示例

示例1:
输入:ransomNote = “a”, magazine = “b”
输出:false
示例2:
输入:ransomNote = “aa”, magazine = “aab”
输出:true

2. 解题思路

首先,从题目中,我们可以知道赎金信中的字母来源于杂志;且每个杂志中的字母,只能用一次;
i:定义一个长度为26的空数组,英文字母为26个,26为上限;

ii:以数组下标代表字符,数组下标一般从0开始,故以0-25代表字符从’a-z’;

iii:用for循环进行遍历,加入判断,以数组中元素的值代表字母出现次数;赎金信中出现的字母,其对应的数组arr[ ]-- ; (-1操作);若数组减少至小于0,则构不成赎金信;

3.代码展示及分析

下面展示一些 内联代码片

// for(auto m:magazine){       
      arr[m-'a']++;  //[m-'a']可以利用ASCII码将字符转为整数
           }    
   for(auto r:ransomNote){     
        arr[r-'a']--;//赎金信中出现的字母,对应数组-1;        
     if(arr[r-'a']<0){          
        return false;
      }

//class Solution {
public:  
bool canConstruct(string ransomNote, string magazine) {  
                  int arr[26] = {0};  
               for(auto m:magazine){  
                   arr[m-'a']++;      
                             }         
              for(auto r:ransomNote){  //for循环进行遍历
                   arr[r-'a']--;   
                if(arr[r-'a']<0){//数组小于零,构不成赎金信
                   return false;     
                              }
                           }
                   return true;  
                         }
                   };

4. auto命令解析

i:可以根据后一个变量的类型自动推导 auto 后面变量的类型

//int a=1;
 float b=2.0;
 auto c=a;//自行判断类型

ii:只读area中的元素

//  for(const auto & a : area)

iii:遍历,创建拷贝,无法修改area中的元素

//  for( auto  a : area)

iiii:可以修改area中的元素

//  for( auto&&  a : area)

5. 运行结果

2021-03-09_第1张图片

2021-03-09_第2张图片

2021-03-09_第3张图片
好了,到这里就结束了,欢迎大家前来评论,共同进步!

你可能感兴趣的:(字符串,数据结构,leetcode,c++)