2022-09-05 19:34:12 +08:00
|
|
|
|
# Leetcode Word-Pattern
|
|
|
|
|
|
|
|
|
|
2022-09-05 19:27
|
|
|
|
|
|
|
|
|
|
> ##### Data structures:
|
|
|
|
|
>
|
|
|
|
|
> #DS #string
|
|
|
|
|
>
|
|
|
|
|
> ##### Difficulty:
|
|
|
|
|
>
|
|
|
|
|
> #coding_problem #difficulty-easy
|
|
|
|
|
>
|
|
|
|
|
> ##### Additional tags:
|
|
|
|
|
>
|
|
|
|
|
> #leetcode
|
|
|
|
|
>
|
|
|
|
|
> ##### Revisions:
|
|
|
|
|
>
|
|
|
|
|
> N/A
|
|
|
|
|
|
|
|
|
|
##### Links:
|
|
|
|
|
|
|
|
|
|
- [Link to problem]()
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
### Problem
|
|
|
|
|
|
|
|
|
|
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`.
|
|
|
|
|
|
|
|
|
|
#### Examples
|
|
|
|
|
|
|
|
|
|
**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**.
|
|
|
|
|
|
|
|
|
|
### Thoughts
|
|
|
|
|
|
|
|
|
|
> [!summary]
|
|
|
|
|
> This is a #string operation problem.
|
|
|
|
|
|
2022-09-06 13:15:36 +08:00
|
|
|
|
The main part is using two hash tables, to check for
|
|
|
|
|
mismatches, and using `istringstream` to read from string
|
2022-09-05 19:34:12 +08:00
|
|
|
|
|
2022-09-06 13:15:36 +08:00
|
|
|
|
Two hash tables:
|
|
|
|
|
- One is used to check for s has one and only bound word
|
|
|
|
|
- The other is used to check that the word is only stored
|
|
|
|
|
once
|
|
|
|
|
|
|
|
|
|
Using one hash table is one way, which makes one way
|
|
|
|
|
unchecked.
|
2022-09-05 19:34:12 +08:00
|
|
|
|
|
|
|
|
|
### Solution
|
2022-09-06 13:15:36 +08:00
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
class Solution {
|
|
|
|
|
public:
|
|
|
|
|
bool wordPattern(string pattern, string s) {
|
|
|
|
|
unordered_map<string, int> stoi;
|
|
|
|
|
unordered_map<char, int> ctoi;
|
|
|
|
|
// convert string to stream
|
|
|
|
|
istringstream input(s);
|
|
|
|
|
string word;
|
|
|
|
|
int n = pattern.size();
|
|
|
|
|
int id;
|
|
|
|
|
|
|
|
|
|
for (id = 0; input >> word; id++) {
|
|
|
|
|
// cout<<word<<'\n';
|
|
|
|
|
if (id == n || stoi[word] != ctoi[pattern[id]]) {
|
|
|
|
|
// pattern OOB, or mismatch.
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// to prevent id == 0 is the default value of map
|
|
|
|
|
stoi[word] = ctoi[pattern[id]] = id + 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (id == n) {
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
// check for lingering word in s
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
```
|