题目
给定一种 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++代码
采用了istringstream类用于执行C++风格的串流的输入操作,作用是从string对象str中读取字符。
采用了两个map,和前边的同构字符串类似。
但是,特殊情况:
pattern = “a”, str = “dceis” 输出为:true;
pattern = “”, str = “dceis” 输出为:false;
pattern = “dceis”, str = “dceis” 输出为:false。
class Solution {
public:
bool wordPattern(string pattern, string str)
{
if(pattern.length()==0) return false;
if(pattern.length()==1) return true;
map<char,int> mp;
map<string,int> ms;
if(str.find(' ')!=string::npos) //str中存在空格,则是字母与单词进行比较
{
istringstream in (str);
int i=0;
for(string word;in>>word;++i)
{
if(mp.find(pattern[i])==mp.end()&&ms.find(word)==ms.end())
{
mp[pattern[i]]=i;
ms[word]=i;
}
else if(mp.find(pattern[i])!=mp.end()&&ms.find(word)!=ms.end())
{
if(mp[pattern[i]]!=ms[word]) return false;
}
else return false;
}
return true;
}
else //str不存在空格
{
if(pattern.length()<str.length()&&pattern==str.substr(0,pattern.length()))
return true;
return false;
}
}
};