Skip to content

Instantly share code, notes, and snippets.

@alexmelyon
Last active July 16, 2019 05:35
Show Gist options
  • Save alexmelyon/5ed9e99eb8c062e6da9a59c4a440f5cd to your computer and use it in GitHub Desktop.
Save alexmelyon/5ed9e99eb8c062e6da9a59c4a440f5cd to your computer and use it in GitHub Desktop.
/**
* Если слова анаграммы, то у них одинаковое количество всех букв
* (то есть в обоих словах 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