Вопрос

Учитывая 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», чтобы удалить пробелы между словами.

  1. Затем мы проверяем, не совпадает ли количество символов в «шаблоне» и количество слов в «s», это означает, что «s» не соответствует одному и тому же шаблону.
  2. После того, как мы убедимся, что количество символов в шаблоне и количество слов в строке 's' совпадают, мы удалим все дубликаты в 's' и 'шаблоне', используя структуру данных Set, и проверим, размер объектов результата одинаковый.
  3. Третьей и последней проверкой будет использование карты с использованием символа шаблона в качестве ключа и слова «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;
};