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

时间:2015-03-13 14:31:48

标签: c++ string

我必须找到要删除的最小字符数才能使两个字符串为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

未获得正确的输出

3 个答案:

答案 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;
}

在这里找到你做错了什么