难度简单302收藏分享切换为英文接收动态反馈
给定一种规律 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
包含了由单个空格分隔的小写字母。
通过次数65,606提交次数143,121
这道题目,本文使用小写字母只有26个来解决这个问题。按照指定字符分隔字符串,C++没有这个函数,需要手动写一写。
class Solution {
public:
void SplitString(const string& s, vector<string>& v, const string& c)
{
string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while(string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2-pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if(pos1 != s.length())
v.push_back(s.substr(pos1));
}
bool wordPattern(string pattern, string s) {
string mystr[26];
vector<string> spilt_s;
SplitString(s, spilt_s, " ");
if(spilt_s.size()!=pattern.size())
return false;
for(int i=0;i<pattern.size();i++)
{
//遇到一个字符串,先判断之前是否包含了,如果包含了,但是下标不相等,则flase
for(int k=0;k<26;k++)
{
if(k!=pattern[i]-'a' && mystr[k]==spilt_s[i].c_str())
return false;
}
//没有包含或者刚好和之前的模式匹配,则继续
mystr[pattern[i]-'a']=spilt_s[i].c_str();
}
string ns; //重新生成字符串,判断两个字符串是否相等
for(int i=0;i<pattern.size();i++)
{
ns+=mystr[pattern[i]-'a'];
ns+=" ";
}
s+=" ";
if(s==ns)
return true;
else
return false;
}
};