class Solution {

public:

    bool wordPattern(string pattern, string str) {

        vector<int> pat_map (26, 0);

        unordered_map<string,int> str_map;

        int i=0, n = pattern.size();

        istringstream ss (str);

        string token;

        

        for(string token; ss >> token; ++i) {

            if(i == n || pat_map[pattern[i]-'a'] != str_map[token]) return false;

            

            // 1-based indexing since map assigns 0 as a default value for keys not found.

            pat_map[pattern[i]-'a'] = str_map[token] = i+1;

        }

        

        return i == n;

    }

};