制作两个字符串anagrams

时间:2017-12-27 07:19:36

标签: javascript anagram

我解决了黑客级别的挑战。它关于如何字谜。我给两个字符串输入,我必须找到...

打印一个整数,表示必须删除的字符数,以使两个字符串彼此形成字符串。

我已经检测到它是否是字谜和差异。但现在可以做其余部分没有任何想法。请帮助。

function main() {
    var a = readLine();
    var b = readLine();
    var sum1 = 0 ;
    var sum2 = 0 ;

    for (var i= 0; i<= a.length-1; i++ )
        {
            sum1 = sum1 + a.charCodeAt(i);
        }

       console.log(sum1);


        for (var i= 0; i<= b.length-1; i++ )
        {
            sum2 = sum2 + b.charCodeAt(i);
        }

       console.log(sum2);

    if(sum1== sum2)
        {
            console.log("anagrams");
        }
    else
        {
            console.log("not anagram");
            var diff = sum1 - sum2;
            console.log(diff);

            /// what to do now ?   
        }


}

4 个答案:

答案 0 :(得分:2)

如果您仍在寻找合理的解决方案,我已经通过使用对象方法对字母的频率进行计数来解决了hackerRank上的问题。

function makeAnagrams(a,b){
  let charA=buildcharMap(a)
  let charB=buildcharMap(b)
  let characters=[]
  let counter=0

 for(let char in charA){
   if(charA[char] && charB[char]){
     if(charA[char]===charB[char]){ //same frequency
        continue;
     }
     else{
       if(charA[char]>charB[char]){
         counter=counter+ charA[char]-charB[char]
       }
       else{
         counter=counter+ charB[char]-charA[char]
       }
     } 
    }
    else{
      counter=counter+charA[char]
    }
 }

  for(let char in charB){
    if(charB[char] && charA[char]===undefined){
        counter=counter+charB[char]
    }
  }
  return counter;
}


function buildcharMap(str){
  var charMap={}
  for(let char of str){
    if (charMap[char]===undefined){
      charMap[char]=1
    }
    else{
      charMap[char]+=1
    }
  }
  return charMap
}

console.log(makeAnagrams('cde','abc'))

答案 1 :(得分:0)

我已经在hackerearth上解决了这个问题,我采取了稍微不同的方法。

我在这段代码中所做的是,我检查了所有字符,如果字符串中的两个字符相同,则用“@”符号替换字符,然后我计算其中一个字符串中的所有“@”符号修改,然后减去该计数的值乘以2(因为......它们在两个字符串中相似)与两个字符串的总长度相比。

这是我的代码,希望您可以将其转换为javascript。 - &GT;

import java.util.Scanner;

public class Anagrams {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int Testcases = scanner.nextInt();

        String[] str1 = new String[1000];
        String[] str2 = new String[1000];

        //  Taking input
        for (int i = 0; i < Testcases; i++) {
            str1[i] = scanner.next().toLowerCase();
            str2[i] = scanner.next().toLowerCase();
        }

        //  For Total Length of both strings
        int TotalLength[] = new int[Testcases];

        //  For counting "@" signs
        int count[] = new int[Testcases];

        //  Loop through TestCases
        for (int i = 0; i < Testcases; i++) {

            TotalLength[i] = str1[i].length() + str2[i].length();

            for (int j = 0; j < str1[i].length(); j++) {
                for (int k = 0; k < str2[i].length(); k++) {
                    //  If both characters are similar, then replace those characters with "@" signs
                    if (str1[i].charAt(j) == str2[i].charAt(k)) {
                        str1[i] = str1[i].replaceFirst(Character.toString(str1[i].charAt(j)),"@");
                        str2[i] = str2[i].replaceFirst(Character.toString(str2[i].charAt(k)),"@");
                    }
                }
            }
        }

        //  Counting "@" signs from one string
        for (int i = 0; i < Testcases; i++) {
            count[i] = 0;
            char[] c1 = str1[i].toCharArray();
            for (char c: c1) {
                if(c == '@'){
                    count[i]++;
                }
            }
        }

        //  Output
        for (int i = 0; i < Testcases; i++) {   
            System.out.println(TotalLength[i] - 2*count[i]);
        }

        scanner.close();
    }
}

答案 2 :(得分:0)

您实际上只是在寻找更高频率的差异之和。您可以将频率计数到26个项目的数组中(规则告诉您只有小写数字)。然后从另一个项目中逐个减去每个数组,然后逐项相加,然后将整个对象相加。好像只需要四行代码:

function makeAnagram(a, b) {
  const makeCountArray = (str) => [...str].reduce((a, c) => (a[c.charCodeAt(0) - 97]++, a), Array(26).fill(0))
  let a1 = makeCountArray(a)
  let a2 = makeCountArray(b)
  return a1.reduce((a, c, i) => a + Math.abs(c - a2[i]), 0)
}

// test case expected: 30
let count = makeAnagram('fcrxzwscanmligyxyvym', 'jxwtrhvujlmrpdoqbisbwhmgpmeoke')
console.log(count)

答案 3 :(得分:0)

这是在每个字符串中使用所有26个字母的Map()的另一种方法

  function makeAnagram(a, b) {
  let result = 0;
  const alphabets = 'abcdefghijklmnopqrstuvwxyz'.split('');

  const getCharCountMap = str => {
    const strArray = str.split('');
    let charMap = new Map();
    alphabets.forEach(alphabet => charMap.set(alphabet, 0));
    strArray.forEach(letter => charMap.set(letter, charMap.get(letter) + 1));
    return charMap;
  };

  const aMap = getCharCountMap(a);
  const bMap = getCharCountMap(b);

  alphabets.forEach(alphabet => {
    result = result + Math.abs(aMap.get(alphabet) - bMap.get(alphabet));
  });

  return result;
}
相关问题