amarao: (Default)
[personal profile] amarao
Один из нескольких разов, когда rust взрывает мозг и офигенен.

Задача:

Given a pattern and a string s, find if s follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.

 

Example 1:

Input: pattern = "abba", s = "dog cat cat dog"
Output: true

Example 2:

Input: pattern = "abba", s = "dog cat cat fish"
Output: false

Example 3:

Input: pattern = "aaaa", s = "dog cat cat dog"
Output: false

Constraints:

  • 1 <= pattern.length <= 300
  • pattern contains only lower-case English letters.
  • 1 <= s.length <= 3000
  • s contains only lowercase English letters and spaces ' '.
  • s does not contain any leading or trailing spaces.
  • All the words in s are separated by a single space.

Решение:

impl Solution {
fn abstract_list<T, G>(input: T) -> Vec<usize>
where
T: Iterator<Item = G>,
G: std::hash::Hash + std::cmp::Eq,
{
let mut dict = HashMap::new();
let mut output = Vec::new();
for elem in input {
let id = dict.len();
output.push(*dict.entry(elem).or_insert(id));
}
output
}
pub fn word_pattern(pattern: String, s: String) -> bool {
Self::abstract_list(pattern.chars()) == Self::abstract_list(s.split_whitespace())
}
}

Я чертовски горжусь
abstract_list. Это функция, которую я осмысленно написал
generic'ом, причём с generic'ом для Item.


Date: 2022-09-26 10:09 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
По-хорошему, конечно, надо бы что-то типа is_consistent_mapping(pattern.chars(), s.split_whitespace()), что было бы вряд ли длиннее, но эато эффективнее.

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 26th, 2026 08:42 pm
Powered by Dreamwidth Studios