Last active
March 23, 2017 18:54
-
-
Save vitkarpov/11bcfb99fa005723087269afc2822c3c to your computer and use it in GitHub Desktop.
"Cracking the coding interview", strings, 1.4.2
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
/** | |
* Проверяет является ли переданная строка | |
* перестановкой палиндрома. | |
* Работает за O(n) и не требует дополнительной памяти, | |
* использует битовый вектор для хранения счетчиков. | |
* | |
* @param {string} str | |
* @returns {boolean} | |
*/ | |
function isPalindromePermutation(str) { | |
const vector = createBitVector(str); | |
return vector === 0 || (vector & (vector - 1)) === 0; | |
} | |
/** | |
* Создает битовый вектор, | |
* который соответствует указанной строке: | |
* для каждого символа на определенной позиции в алфавите | |
* переключается состояние бита на этой позиции. | |
* | |
* @param {string} str | |
* @returns {number} | |
*/ | |
function createBitVector(str) { | |
let vector = 0; | |
for (let i = 0; i < str.length; i++) { | |
vector = toggle(vector, getCharIndex(str[i])); | |
} | |
return vector; | |
} | |
/** | |
* Переключает один конкретный бит | |
* на определенной позиции в векторе | |
* | |
* @param {number} vector | |
* @param {number} index | |
* @returns {number} | |
*/ | |
function toggle(vector, index) { | |
if (index < 0) { | |
return vector; | |
} | |
let mask = 1 << index; | |
if ((vector & mask) === 0) { | |
vector |= mask; | |
} else { | |
vector &= ~mask; | |
} | |
return vector; | |
} | |
/** | |
* Возвращает порядковый номер индекса | |
* в английском алфавите (от 0 до 25). | |
* Если это не буква — вернется -1. | |
* | |
* @param {string} char | |
* @returns {number} | |
*/ | |
function getCharIndex(char) { | |
const index = char.toLowerCase().charCodeAt(0) - 'a'.charCodeAt(0); | |
if (index < 0 || index > 25) { | |
return -1; | |
} | |
return index; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment