Вопрос
Учитывая pattern
и строку s
, найдите, соответствует ли s
тому же шаблону. Здесь follow означает полное совпадение, т. е. биекцию между буквой в pattern
и непустым словом в s
.
Пример 1:
Input: pattern = "abba", s = "dog cat cat dog" Output: true
Пример 2:
Input: pattern = "abba", s = "dog cat cat fish" Output: false
Пример 3:
Input: pattern = "aaaa", s = "dog cat cat dog" Output: false
Ограничения:
1 <= pattern.length <= 300
pattern
содержит только строчные английские буквы.1 <= s.length <= 3000
s
содержит только строчные английские буквы и пробелы' '
.s
не содержит начальных или конечных пробелов.- Все слова в
s
разделены одним пробелом.
Подход — JavaScript-решение
Первым шагом будет разделение строки «s», чтобы удалить пробелы между словами.
- Затем мы проверяем, не совпадает ли количество символов в «шаблоне» и количество слов в «s», это означает, что «s» не соответствует одному и тому же шаблону.
- После того, как мы убедимся, что количество символов в шаблоне и количество слов в строке 's' совпадают, мы удалим все дубликаты в 's' и 'шаблоне', используя структуру данных Set, и проверим, размер объектов результата одинаковый.
- Третьей и последней проверкой будет использование карты с использованием символа шаблона в качестве ключа и слова «s» в качестве значения, если символ шаблона уже существует, затем проверьте, совпадает ли слово, соответствующее этой позиции, с тем, что уже существует на карте, иначе это означает что 's' не соответствует тому же шаблону. Проделайте этот процесс для длины рисунка.
/** * @param {string} pattern * @param {string} s * @return {boolean} */ var wordPattern = function(pattern, s) { let sSplit = s.split(' '); let pLength = pattern.length; if (sSplit.length !== pLength) return false; // returns a unique value object if(new Set(sSplit).size !== new Set(pattern).size) return false; let map = new Map(); //adding pattern: s values in map, if the pattern literal already exist in map, and its corresponsing //value is not equal to current string value at ith position then the string is not valid for(let i=0; i<pLength; i++) { if(map.has(pattern[i]) && (map.get(pattern[i]) !== sSplit[i])) return false; map.set(pattern[i], sSplit[i]); } return true; };