notes/OJ notes/pages/Leetcode Word-Pattern.md

110 lines
2.1 KiB
Markdown
Raw Permalink Normal View History

2022-09-05 19:34:12 +08:00
# Leetcode Word-Pattern
2022-09-05 19:27
> ##### Data structures:
>
> #DS #string
>
> ##### Difficulty:
>
2022-09-06 20:22:48 +08:00
> #coding_problem #difficulty_easy
2022-09-05 19:34:12 +08:00
>
> ##### Additional tags:
>
2022-09-06 20:22:48 +08:00
> #leetcode
2022-09-05 19:34:12 +08:00
>
> ##### 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
2022-09-06 20:22:48 +08:00
- `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**.
2022-09-05 19:34:12 +08:00
### Thoughts
> [!summary]
> This is a #string operation problem.
2022-09-06 20:22:48 +08:00
The main part is using two hash tables, to check for
2022-09-06 13:15:36 +08:00
mismatches, and using `istringstream` to read from string
2022-09-05 19:34:12 +08:00
2022-09-06 20:22:48 +08:00
Two hash tables:
2022-09-06 13:15:36 +08:00
- One is used to check for s has one and only bound word
2022-09-06 20:22:48 +08:00
- The other is used to check that the word is only stored
2022-09-06 13:15:36 +08:00
once
2022-09-06 20:22:48 +08:00
Using one hash table is one way, which makes one way
2022-09-06 13:15:36 +08:00
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;
}
}
};
2022-09-06 20:22:48 +08:00
```