要从两个字符串中删除的字符数最少,以使其成为字谜

Minimum no of characters to be deleted from both the strings to make it anagram

本文关键字:字符 两个 删除 字符串      更新时间:2023-10-16

我必须找到要删除的最小字符数才能使两个字符串字谜,但我的代码没有给出所需的确切值:

我的代码:

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一样,对于第一个字符串,我加 1 给它,对于另一个字符串,我减去 1 的结果是我得到了那些不匹配的位置或字母,我正在计算它们以获得答案。

但是对于这个测试用例:

fcrxzwscanmligyxyvym     // First string
jxwtrhvujlmrpdoqbisbwhmgpmeoke     //Second string

输出 :

30

无法获得正确的输出

您的for循环扫描输入字符串的前 26 个字符,尽管这些字符串可能短于 26 个字符或长于 26 个字符...

在javascript中,你可以这样做。

var input ="accfgilmmnrsvwxxyyyznbddeeghhijjklmmmooppqrrstuvwwx";
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);
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;
}

在这里找到你做错了什么