我必须找到要删除的最小字符数才能使两个字符串为anagram,但我的代码没有给出所需的确切值:
我的代码:
int main() {
int arr[26]={0};
int i,cont=0;
char a[10000];
char b[10000];
cin>>a;
cin>>b;
int l1=strlen(a);
int l2=strlen(b);
for(i=0;i<l1;i++)
arr[a[i]-'a']+=1;
for(i=0;i<l2;i++)
arr[b[i]-'a']-=1;
for(i=0;i<26;i++)
{
if(arr[i]!=0)
{
cont=cont+abs(arr[i]);
}
}
cout<<cont;
return 0;
}
我的代码说明:
我在其中创建了一个26
个内存位置数组,将所有内容初始化为0
。
然后我生成的地点arr[i]
包含一个字符,如果我们按'a'
减去它,它会给出确切的位置:例如arr[i]='a'
'a'-a'=0
,第一个string我正在为它添加1而另一个字符串我减去1它因此我得到那些不匹配的位置或字母,我正在计算它们以获得答案。
但对于这个测试用例:
fcrxzwscanmligyxyvym // First string
jxwtrhvujlmrpdoqbisbwhmgpmeoke //Second string
输出:
30
未获得正确的输出
答案 0 :(得分:1)
你的for
循环扫描输入字符串的前26个字符,尽管这些字符串可能短于或长于26个字符......
答案 1 :(得分:0)
在javascript中你可以这样做。
var input ="accfgilmmnrsvwxxyyyz\nbddeeghhijjklmmmooppqrrstuvwwx";
var str1, str2, arr =[], l1, l2, t1, t2;
arr = input.trim().split('\n');
str1 = arr[0].toLowerCase();
str2 = arr[1].toLowerCase();
if(str1.length>str2.length){
temp = str1;
str1 = str2;
str2 = temp;
}
l1 = str1.length;
l2 = str2.length;
var n=0;
for(var i=0; i<l1; i++){
if(str2.indexOf(str1[i]) != -1){
var j = str2.indexOf(str1[i]);
str2 = str2.slice(0, j) + str2.slice(j+1);
n++;
}
}
console.log(l1+l2-n-n);
答案 2 :(得分:0)
int numberNeeded(String first, String second) {
int[] map=new int[255];
int len1=first.length();
int len2=second.length();
for(int i=0;i<len1;i++)
map[(int)first.charAt(i)]++;
for(int i=0;i<len2;i++)
map[(int)second.charAt(i)]--;
int count=0;
for(int i=0;i<255;i++)
{
count=count+Math.abs(map[i]);
}
return count;
}
在这里找到你做错了什么