2014-01-29 61 views
0

我有点卡住这个java问题,涉及返回字符串数组中的同构对的数量。我写的代码不断返回不正确的同构字对数。Java同构代码

同构词的定义如下:如果一个词中的字母可以重新映射以获得第二个词,则称两个词同构。重新映射一个字母意味着用另一个字母替换它的所有事件。字母的排序保持不变。没有两个字母可以映射到同一个字母,但是一个字母可以映射到它自己。 例如,“abca”和“zbxz”这两个词是同构的,因为我们可以将'a'映射为'z','b'映射为'b','c'映射为'x'。 我不包含我在函数中调用的getMap方法。 getMap方法将任何字符串作为输入,并返回一个映射,其中键是字符串中的字母,相应的值是该字母出现在字符串中的次数。

public class IsomorphicWords { 
    public int countPairs(String[] words) { 
    Set <String> pairs = new HashSet<String>(); 
    for (String word:words){ 
     Map noOfOccurencesOfEachLetter= getMap(word); 
     ArrayList<Integer> valuesFromFirstWord = new ArrayList<Integer>(noOfOccurencesOfEachLetter.values()); 
     Collections.sort(valuesFromFirstWord); 
     java.util.List<String> list = new ArrayList<String>(Arrays.asList(words)); 
     list.remove(word); 
     String[] oneLessWord = list.toArray(new String[words.length-1]); 
     for(String secondWord:oneLessWord){ 
      Map secondNoOfOccurencesOfEachLetter = getMap(secondWord); 
      ArrayList<Integer> valuesFromSecondWord = new ArrayList<Integer>(secondNoOfOccurencesOfEachLetter.values()); 
      Collections.sort(valuesFromSecondWord); 
      if (valuesFromFirstWord.equals(valuesFromSecondWord)){ 
       pairs.add(""+word+","+secondWord+""); 
      } 
      else{ 
       continue; 
      } 
     } 


    } 
return pairs.size()/2; 
public Map getMap(String word){ 
     HashMap<String,Integer> noOfOccurencesOfEachLetter= new HashMap<String,Integer>(); 
     for (int i=0;i<word.length();i++){ 
      char letter = word.charAt(i); 
      String letterInDictionary= Character.toString(letter); 
      if (noOfOccurencesOfEachLetter.containsKey(letterInDictionary)==true){ 
       int count= noOfOccurencesOfEachLetter.get(letterInDictionary); 
       noOfOccurencesOfEachLetter.put(letterInDictionary, count+1); 
      } 
      else{ 
       noOfOccurencesOfEachLetter.put(letterInDictionary, 1); 
      } 
     } 
     return noOfOccurencesOfEachLetter; 
    } 
} 

我真的很感激你可以给我这个代码的任何反馈。

感谢, 朱奈德

+0

你的意思是不正确的?你能给我们提供样品输入,不正确的输出和所需的输出吗? –

+2

我强烈建议你开始重构你的代码。写一个简单的函数来确定两个单词是否同构。然后,您可以在调试器中测试该功能,并且肯定会发现一些问题。祝你好运。 –

+0

为什么在给它添加任何内容之前排序valuesFromFirstWord? –

回答

3

它之所以给出了不正确的答案可能来自你信取数,不看位置,他们已经在这两个词。我想到的第一个解决方案是创建一个新的数组,其中将字母翻译为每个单词首次出现的这个字母的索引。例如:“abcd”将是“0123”,“abca”将是“0120”,“fhjf”也将是“0120”。然后你可以简单地比较结果。我希望这可以帮助...

0
public int countPairs(String[] words) { 
    int isomorphicPairs = 0; 
    for (int i = 0; i < words.length; i++) { 
     for (int j = i+1; j < words.length; j++) { 
      if (words[i].length() == words[j].length()) { 
       String tmp = new String(words[j]); 
       for (int k = 0; k < tmp.length(); k++) 
        tmp = tmp.replaceAll("" + tmp.charAt(k), "" + words[i].charAt(k)); 
       if (words[i].equals(tmp)) isomorphicPairs++; 
      } 
     } 
    } 
    return isomorphicPairs; 
}