LeetCode/solutions/290. Word Pattern.md
2020-07-25 11:12:30 +08:00

71 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [290. Word Pattern](https://leetcode.com/problems/word-pattern/description/)
# 思路
类似[205. Isomorphic Strings](https://leetcode.com/problems/isomorphic-strings/description/), 所以解题思路基本一样。
将pattern和str中个每个元素都用一个数代替,这个数代表了该元素是第几个出现的(如 "abba" -> 1221, "dog cat cat dog" -> 1221), 则结果应该是一样的。
为了记录是否出现过pattern用一个长度为26的数组实现str用map来实现此外还用一个count计数。
更新:
可以用`istringstream`很方便地将`str`按照空格分开。
# C++
```C++
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<string, int>mp;
vector<int>vc(26, 0);
string sub_str;
int count = 1, pos = 0, pre; // pos记录空格的下一个位置pre为上一个空格位置的下一个位置
for(int i = 0; i < pattern.size(); i++){
if(pos >= str.size()) return false; // str中元素少于pattern中的元素
pre = pos;
while(str[pos] != ' ' && pos < str.size()) pos++; // 此时pos为空格的位置或str结束位置
// s.substr(pos1,n)返回字符串s从pos1开始n个字符组成的串
sub_str = str.substr(pre, pos - pre);
pos++; // pos记录空格的下一个位置
// 以下代码基本同205题
if(vc[pattern[i] - 'a'] != mp[sub_str]) return false;
if(vc[pattern[i] - 'a'] == 0){
vc[pattern[i] - 'a'] = count;
mp[sub_str] = count++;
}
}
if(pos != str.size() + 1) return false; // str中元素多余pattern中的元素
return true;
}
};
```
更新:
``` C++
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char, int>c_mp;
vector<int>c2int;
unordered_map<string, int>str_mp;
int count = 0;
for(char c: pattern){
if(c_mp.find(c) == c_mp.end()) c_mp[c] = count++;
c2int.push_back(c_mp[c]);
}
count = 0;
int i = 0;
string cur;
istringstream iss(str);
while(iss.good()){ // or !iss.eof()
iss >> cur;
if(str_mp.find(cur) == str_mp.end()) str_mp[cur] = count++;
if(i >= c2int.size() || c2int[i] != str_mp[cur]) return false;
i++;
}
return i == c2int.size();
}
};
```