给定一种 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
包含了由单个空格分隔的小写字母。
C++
class Solution {
public:
bool wordPattern(string pattern, string str)
{
int start=-1;
vector<string> tmp;
int m=str.length();
for(int i=0;i<m;i++)
{
if(' '==str[i])
{
tmp.push_back(str.substr(start+1,i-1-start));
start=i;
}
}
tmp.push_back(str.substr(start+1,m-1-start));
int n=pattern.size();
if(n!=tmp.size())
{
return false;
}
map<char,string> tmp1;
map<string,char> tmp2;
for(int i=0;i<n;i++)
{
if(tmp1.find(pattern[i])==tmp1.end())
{
tmp1[pattern[i]]=tmp[i];
}
else
{
if(tmp1[pattern[i]]!=tmp[i])
{
return false;
}
}
if(tmp2.find(tmp[i])==tmp2.end())
{
tmp2[tmp[i]]=pattern[i];
}
else
{
if(tmp2[tmp[i]]!=pattern[i])
{
return false;
}
}
}
return true;
}
};
python
class Solution:
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
dic={}
st=set()
ss=[] #存放空字符的下标
temp=[] #存放str中的单词
count=1
n=len(str)
for i in range(1,n-1):
if str[i]==' ':
count += 1
ss.append(i)
m=len(pattern)
if m!=count:
return False
if count==1:
return True
aa=str[0:ss[0]]
temp.append(aa)
con=len(ss)
for i in range(1,con):
aa=str[ss[i-1]+1:ss[i]]
temp.append(aa)
aa=str[ss[con-1]+1:]
temp.append(aa)
for i in range(0,m):
if pattern[i] not in dic:
dic[pattern[i]]=temp[i]
st.add(temp[i])
else:
if dic[pattern[i]]!=temp[i]:
return False
return len(dic)==len(st)