Last active
July 16, 2019 05:35
-
-
Save alexmelyon/5ed9e99eb8c062e6da9a59c4a440f5cd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Если слова анаграммы, то у них одинаковое количество всех букв | |
* (то есть в обоих словах 2 буквы а, одна буква р, нет буквы к, и тд). | |
* Во втором слове можно запомнить индексы соответствующих букв, | |
* и найти эти же конкретные буквы в первом слове. | |
* Например слова АААААББДКРР АБРАКАДАБРА, тогда массив из чисел, | |
* который показывает на каком месте буква из первого слова | |
* расположена во втором, будет выглядеть так: | |
* 0,3,5,7,10,1,9,6,4,2,8. | |
* Если непонятно зачем это нужно, то сейчас поясню | |
* Если пробежаться по всем этим числам в порядке возрастания, | |
* и выводить для текущего числа соответствующую (по индексу) | |
* букву из первой строки, то получится втрое слово. | |
* | |
* А чтобы вывести все промежуточные преобразования строки, | |
* надо этот массив отсортировать пузырьком (так как менять можно только 2 соседних элемента). | |
* Ну и в процессе сортировки выводить измененную строку. | |
*/ | |
fun main() { | |
val word1 = "word" | |
val word2 = "drwo" | |
val chars1 = getCharsCount(word1) | |
val chars2 = getCharsCount(word2) | |
val isAnagram = chars1.all { chars2.containsKey(it.key) && chars2[it.key] == chars1[it.key] } | |
println("isAnagram $isAnagram") | |
if (!isAnagram) { | |
return | |
} | |
val temp = word2.mapIndexed { index, c -> c as Char? to index }.toMutableList() | |
val charToIndex = mutableListOf<Pair<Char?, Int>>() | |
for (i in 0 until word1.length) { | |
val c = word1[i] | |
val first = temp.indexOfFirst { it.first == c } | |
val pair = temp[first] | |
charToIndex.add(pair) | |
temp.removeAt(first) | |
temp.add(first, pair) | |
} | |
for(i in 0 until charToIndex.size) { | |
val sorted = charToIndex.map { it.first }.joinToString("") | |
println(sorted) | |
for(j in i until charToIndex.size) { | |
if(word2 == sorted) { | |
return | |
} | |
if(charToIndex[i].second >= charToIndex[j].second) { | |
val swap = charToIndex[i] | |
charToIndex[i] = charToIndex[j] | |
charToIndex[j] = swap | |
} | |
} | |
} | |
} | |
fun getCharsCount(word: String): Map<Char, Int> { | |
return word.map { it to 1 } | |
.groupBy { it.first } | |
.map { it.key to it.value.sumBy { it.second } } | |
.toMap() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment