Я как бы застрял в этой java-проблеме, связанной с возвратом числа изоморфных пар в массив строк. Код, который я написал, продолжает возвращать неправильное число изоморфных пар слов.Java Isomorphic Code
Определение изоморфных слов задается следующим образом: Два слова называются изоморфными, если буквы в одном слове можно перегруппировать, чтобы получить второе слово. Перемещение буквы означает замену всех вхождений в нее другой буквой. Порядок букв остается неизменным. Никакие две буквы не могут сопоставляться с одним и тем же письмом, но буква может отображаться сама по себе. Например, слова «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;
}
}
Я бы очень признателен за любые отзывы, которые вы можете дать мне по этому коду.
Спасибо, Junaid
Что вы подразумеваете под неправильным? Можете ли вы дать нам образец ввода, неправильный вывод и желаемый выход? –
Я настоятельно рекомендую вам начать рефакторинг кода. Напишите простую функцию, которая определяет, являются ли два слова изоморфными. Затем вы можете проверить эту функцию в отладчике и наверняка найдете некоторые проблемы. Удачи. –
Почему вы сортируете значенияFromFirstWord, прежде чем добавлять что-нибудь к нему? –