leetcode 290. Word Pattern 、lintcode 829. Word Pattern II
290. Word Pattern
istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流,这样就实现了字符串的空格切割。
C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
1.本题中str是带空格的字符串,需要将每个词根据提取出来,就使用istringstream。
2.本题要求的是pattern中的字符和str中的单词是一一对应的,所以不仅要判断当前pattern字符与存储在hash中的的映射是否相同,还需要判断hash中映射的string是否与当前string相同。
3.可能存在pattern和str个数不一样的情况,所以最后使用i == n来判断。
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char,string> m;
istringstream in(str);
int i = ,n = pattern.size();
for(string tmp;in >> tmp;i++){
if(m.find(pattern[i]) == m.end()){
for(auto it = m.begin();it != m.end();it++){
if(it->second == tmp)
return false;
}
m[pattern[i]] = tmp;
}
else{
if(m[pattern[i]] != tmp)
return false;
}
}
return i == n;
}
};
这种情况就是两者个数不相同。
Input:
"jquery"
"jquery"
Output:
true
Expected:
false
829. Word Pattern II
https://www.cnblogs.com/grandyang/p/5325761.html
不知道哪个单词对应哪个词,就用递归去搜索每种可能性
class Solution {
public:
/**
* @param pattern: a string,denote pattern string
* @param str: a string, denote matching string
* @return: a boolean
*/
bool wordPatternMatch(string &pattern, string &str) {
// write your code here
unordered_map<char,string> m;
int index1 = ,index2 = ;
return wordPatternMatch(pattern,index1,str,index2,m);
}
bool wordPatternMatch(string &pattern,int index1,string &str,int index2,unordered_map<char,string> &m){
if(index1 == pattern.size() && index2 == str.size())
return true;
if(index1 == pattern.size() || index2 == str.size())
return false;
char word = pattern[index1];
for(int i = index2;i < str.size();i++){
string tmp = str.substr(index2,i - index2 + );
if(m.count(word) && m[word] == tmp){
if(wordPatternMatch(pattern,index1+,str,i+,m))
return true;
}
else if(!m.count(word)){
bool flag = false;
for(auto it : m){
if(it.second == tmp)
flag = true;
}
if(!flag){
m[word] = tmp;
if(wordPatternMatch(pattern,index1+,str,i+,m))
return true;
m.erase(word);
}
}
}
}
};
自己又写了一个版本:
其实主要是如果当前不满足true的条件,就继续遍历
if(m.find(word) != m.end()){
if(m[word] == tmp){
if(wordPatternMatch(pattern,str,index1+1,i+1,m))
return true;
}
}
如果word != tmp,不做任何处理直接继续遍历下一个位置就好了
if(flag)
continue;
如果在map中找到了tmp,也就不满足条件,这个时候也不做任何处理,直接继续遍历就好了
class Solution {
public:
/**
* @param pattern: a string,denote pattern string
* @param str: a string, denote matching string
* @return: a boolean
*/
bool wordPatternMatch(string &pattern, string &str) {
// write your code here
unordered_map<char,string> m;
int index1 = ,index2 = ;
return wordPatternMatch(pattern,str,index1,index2,m);
}
bool wordPatternMatch(string pattern,string str,int index1,int index2,unordered_map<char,string> m){
if(index1 == pattern.size() && index2 == str.size())
return true;
else if(index1 == pattern.size() || index2 == str.size())
return false;
char word = pattern[index1];
for(int i = index2;i < str.size();i++){
string tmp = str.substr(index2,i - index2 + );
if(m.find(word) != m.end()){
if(m[word] == tmp){
if(wordPatternMatch(pattern,str,index1+,i+,m))
return true;
}
}
else{
bool flag = false;
for(auto it = m.begin();it != m.end();it++){
if(it->second == tmp){
flag = true;
break;
}
}
if(flag)
continue;
m[word] = tmp;
if(wordPatternMatch(pattern,str,index1+,i+,m))
return true;
m.erase(word);
}
}
}
};
leetcode 290. Word Pattern 、lintcode 829. Word Pattern II的更多相关文章
- lintcode 394. Coins in a Line 、leetcode 292. Nim Game 、lintcode 395. Coins in a Line II
变型:如果是最后拿走所有石子那个人输,则f[0] = true 394. Coins in a Line dp[n]表示n个石子,先手的人,是必胜还是必输.拿1个石子,2个石子之后都是必胜,则当前必败 ...
- LeetCode 290 Word Pattern(单词模式)(istringstream、vector、map)(*)
翻译 给定一个模式,和一个字符串str.返回str是否符合同样的模式. 这里的符合意味着全然的匹配,所以这是一个一对多的映射,在pattern中是一个字母.在str中是一个为空的单词. 比如: pat ...
- [LeetCode] 290. Word Pattern 词语模式
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
- LeetCode 290. Word Pattern (词语模式)
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
- [LeetCode] 290. Word Pattern 单词模式
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
- LeetCode 290 Word Pattern
Problem: Given a pattern and a string str, find if str follows the same pattern. Here follow means a ...
- Java [Leetcode 290]Word Pattern
题目描述: Given a pattern and a string str, find if str follows the same pattern. Here follow means a fu ...
- leetcode 290 Word Pattern(map的应用)
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...
- Leetcode 290 Word Pattern STL
Leetcode 205 Isomorphic Strings的进阶版 这次是词组字符串和匹配字符串相比较是否一致 请使用map来完成模式统计 class Solution { public: boo ...
随机推荐
- vs中找到接口和抽象类的具体实现类
如何找到接口和抽象类的具体实现类 1,可以使用:ctrl+k clrl+t打开调用层次结构窗口: 2,移动到实现节点: 3,然后可以转到具体实现: 第二种安装插件 ReSharper 第三种方法: 在 ...
- python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...
- C#屏蔽Alt+F4组合键
在开发的软件不希望用户关闭的情况下,或者我们不想用户回到桌面,这时候我们就需要屏蔽windows键,或者Alt + F4 键等. //1.将窗体的属性KeyPrieview设置为true //keyp ...
- 0025SpringMVC的几种响应方式
本文主要涉及到一下几种响应方式: 1.返回字符串2.返回void3.返回ModelAndView4.转发关键字forward和重定向关键字redirect返回字符串5.ajax调用返回json 具体实 ...
- 集合(Collection)类
集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. ...
- Hive ACID和事务表支持详解
一.ACID介绍 ACID就是常见数据库事务的四大特性:Atomicity(原子性).Consistency(一致性).Isolation(隔离性).Durability(持久性). 在Hive 0. ...
- C结构体struct 和 共用体union的使用测试
#include <stdio.h> struct { char name[10]; char sex; char job; int num; union{ //联合只能共用同一个内存 i ...
- 猴猴的比赛 dfs序
猴猴的比赛 dfs序 两颗\(n\)节点的树,不相同,问多少点对\((u,v)\)在两棵树上均满足路径\(v\)在\(u\)子树中 \(n\le 10^5\) 暴力: \(n^2\)暴力枚举点对用\( ...
- 【概率论】5-10:二维正态分布(The Bivariate Normal Distributions)
title: [概率论]5-10:二维正态分布(The Bivariate Normal Distributions) categories: - Mathematic - Probability k ...
- AtCoder Grand Contest 017题解
传送门 \(A\) 直接转移就是了 typedef long long ll; const int N=55; ll f[N][2];int a[N],n,p; int main(){ scanf(& ...