我有点陷入这个涉及返回字符串数组中同构对数的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;
}
}
非常感谢您可以提供有关此代码的任何反馈。
谢谢,
朱尼德
最佳答案
它给出错误答案的原因可能是由于您计算了字母数,而不是看他们在两个单词中的位置。我想到的第一个解决方案是创建一个新数组,在该数组中,您将字母转换为每个单词该字母首次出现的索引。例如:“ abcd”将是“ 0123”,“ abca”将是“ 0120”,“ fhjf”也将是“ 0120”。然后,您可以简单地比较结果。我希望这有帮助...