给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。
思路分析:此题就是将pattern中的字符与str中对应顺序的单词匹配关联,并且将str中的单词与pattern中对应顺序的字符关联。
请翻阅 LeetCode 同构字符串
与上一题基本相同,就是一个是字符之间的关联,一个是字符与字符串之间的关联。
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> vs = split(str, ' ');//对str串,以空格为分割字符进行分割
vector<char> vc;//将pattern的个字符复制
for (auto & i : pattern){
vc.push_back(i);
}
//如果两个匹配的容器长度相同
if (vc.size() != vs.size())
return false;
unordered_map<char, string> patternToStr;//pattern中的字符匹配str中的单词
unordered_map<string, char> strToPattern;//str中的字符匹配pattern中的单词
auto it1 = vc.begin();
auto it2 = vs.begin();
//开始匹配
while (it1 != vc.end() && it2 != vs.end()){
if (patternToStr.find(*it1) != patternToStr.end() || strToPattern.find(*it2) != strToPattern.end()){
if (patternToStr[*it1] != *it2 || strToPattern[*it2] != *it1) {
return false;
}
}
else{
//互相标记
patternToStr[*it1] = *it2;
strToPattern[*it2] = *it1;
}
it1++;
it2++;
}
return true;
}
//对str串进行分割,ch为分割字符
vector<string> split(string str, char ch) {
vector<string> resVec;
int strSize = str.size(), index = 0;
//扫描字符串str,每遇到ch字符就分割
while (index < strSize) {
string tempStr = "";//截取上一个ch(或者起始端)到下一个ch(或者尾端)之间的字符段
while (index < strSize && str[index] != ch) {
tempStr += str[index++];
}
resVec.push_back(tempStr);
index += 1;
}
return resVec;
}
};