> For the complete documentation index, see [llms.txt](https://jimmylin1991.gitbook.io/practice-of-algorithm-problems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jimmylin1991.gitbook.io/practice-of-algorithm-problems/string/290.-word-pattern.md).

# 290. Word Pattern

Given a `pattern` and a string `str`, find if `str` 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 `str`.

**Example 1:**

```
Input: pattern = "abba", str = "dog cat cat dog"
Output: true
```

**Example 2:**

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

**Example 3:**

```
Input: pattern = "aaaa", str = "dog cat cat dog"
Output: false
```

**Example 4:**

```
Input: pattern = "abba", str = "dog dog dog dog"
Output: false
```

**Notes:**\
You may assume `pattern` contains only lowercase letters, and `str` contains lowercase letters that may be separated by a single space.

```cpp
bool wordPattern(string pattern, string str) { // time: O(n); space: O(n)
    unordered_map<char, string> char2str;
    unordered_set<string> strSt;
    istringstream is(str);
    string cur;
    int i = 0, n = pattern.size();
    while (i < n && is >> cur) {
        if ((char2str.count(pattern[i]) && char2str[pattern[i]] != cur) ||
            !char2str.count(pattern[i]) && strSt.count(cur)) 
            return false;
        else {
            char2str[pattern[i]] = cur;
            strSt.insert(cur);
        }
        ++i;
    }
    return i == n && !(is >> cur);
}
```
