思路很简单:查到就改
bool canConstruct(char* ransomNote, char* magazine) {
for(long x=0;x<strlen(ransomNote);x++)
{
for(long y=0;y<strlen(magazine);y++)
{
if(magazine[y]==ransomNote[x])
{
ransomNote[x]='1';
magazine[y]='1';
break;
}
}
}
for(long x=0;x<strlen(ransomNote);x++)
{
if(ransomNote[x]!='1')
{
return false;
}
}
return true;
}
这是笔者的代码,因为magazine数据过大毙了,整体思路为如果相同则将目标字符串对应位置标为1,再将样本字符串对应位置标为1并break,防止其再次进行判断
所以这是通过大佬的代码
bool canConstruct(char * ransomNote, char * magazine){
int l_r = strlen(ransomNote);
int l_m = strlen(magazine);
if(l_r > l_m) return false;
int count = 0;
for(int i = 0; i < l_r; i++){
for(int j = 0; j < l_m; j++){
if(ransomNote[i] == magazine[j]){
count++;
magazine[j] = ' ';//如果在杂志上找到了对应的字母,则将杂志上的字母改掉
break;
}
}
}
if(count == l_r) return true;
else return false;
}
同样是遍历,大佬只是计算匹配次数并与目标字符串长度进行比较,对样本字符串的处理和我相同,但是减少了一次遍历,大大缩短了时间