给定一种 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)
{
map<char,string> dic;
set<string> st;
int n=str.length();
vector<int> ss;
vector<string> temp;
string aa;
int count=1;
for(int i=1;i<n-1;i++)
{
if(str[i]==' ')
{
count++;
ss.push_back(i);
}
}
int m=pattern.length();
if(m!=count)
{
return false;
}
if(count==1)
{
return true;
}
aa=str.substr(0,ss[0]);
temp.push_back(aa);
for(int i=1;i<ss.size();i++)
{
aa=str.substr(ss[i-1]+1,ss[i]-ss[i-1]-1);
temp.push_back(aa);
}
aa=str.substr(ss[ss.size()-1]+1,n-ss[ss.size()-1]);
temp.push_back(aa);
for(int i=0;i<m;i++)
{
if(dic.count(pattern[i])<1)
{
dic.insert(pair<char,string>(pattern[i],temp[i]));
st.insert(temp[i]);
}
else
{
if(dic[pattern[i]]!=temp[i])
{
return false;
}
}
}
return dic.size()==st.size();
}
};
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)