题目
思路:
- 设置哈希表作用的数组temp,储存ransomNote中每个字母的个数
- 通过遍历magnize字符串,使magnize中每个字母出现的个数减一
- 判断temp数组里ransomNote中的字母个数是否为0,输出结果
遇到的问题
- 最后一次循环时的判断语句出错:若r=‘aa’ 、m=‘aab’时输出false,则可知判断标准应为>0
- 最后一次循环时的判断语句出错*2:若上述已修改,当r=‘a’ 、m=‘b’时输出true,则可知循环结束条件应为i<rlen
bool canConstruct(char * ransomNote, char * magazine){
int rlen=strlen(ransomNote);
int mlen=strlen(magazine);
int temp[26]={0};
if(rlen>mlen)return false;
for(int i=0;i<rlen;i++)
{
temp[ransomNote[i]-'a']++;
}
for(int i=0;i<mlen;i++)
{
temp[magazine[i]-'a']--;
}
for(int i=0;i<mlen;i++)
{
if(temp[magazine[i]-'a']!=0)return false;
}
return true;
}
修改过后的正确代码:
bool canConstruct(char * ransomNote, char * magazine){
int rlen=strlen(ransomNote);
int mlen=strlen(magazine);
int temp[26]={0};
if(rlen>mlen)return false;
for(int i=0;i<rlen;i++)
{
temp[ransomNote[i]-'a']++;
}
for(int i=0;i<mlen;i++)
{
temp[magazine[i]-'a']--;
}
for(int i=0;i<rlen;i++)
{
if(temp[ransomNote[i]-'a']>0)return false;
}
return true;
}
优化版代码(对比第一版减少了rlen次循环)
bool canConstruct(char * ransomNote, char * magazine){
int rlen=strlen(ransomNote);
int mlen=strlen(magazine);
int temp[26]={0};
if(rlen>mlen)return false;
for(int i=0;i<rlen;i++)
{
temp[ransomNote[i]-'a']++;
temp[magazine[i]-'a']--;
}
if(rlen<mlen)
{
for(int i=rlen;i<mlen;i++)
{
temp[magazine[i]-'a']--;
}
}
for(int i=0;i<rlen;i++)
{
if(temp[ransomNote[i]-'a']>0)return false;
}
return true;
}