翻译

给定一个模式,和一个字符串str。返回str是否符合同样的模式。

这里的符合意味着全然的匹配,所以这是一个一对多的映射,在pattern中是一个字母。在str中是一个为空的单词。

比如:

pattern = “abba”。 str = “dog cat cat dog” 应该返回真。

pattern = “abba”, str = “dog cat cat fish” 应该返回假。

pattern = “aaaa”, str = “dog cat cat dog” 应该返回假。

pattern = “abba”, str = “dog dog dog dog” 应该返回假。

批注:

你可以假定pattern中仅仅包括小写字母,在str中仅仅包括被单个空格隔开的小写字母。

原文

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.

Examples:

pattern = “abba”, str = “dog cat cat dog” should return true.

pattern = “abba”, str = “dog cat cat fish” should return false.

pattern = “aaaa”, str = “dog cat cat dog” should return false.

pattern = “abba”, str = “dog dog dog dog” should return false.

Notes:

You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

分析

我发现我真是越来越爱LeetCode了 ……

今天刚做了一道相似的题目:

LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)

仅仅只是本题是升级版的,之前是字母匹配字母。如今是字母匹配单词了。

之前的题目示比例如以下:

For example,
Given "egg", "add", return true. Given "foo", "bar", return false. Given "paper", "title", return true.

当时我们实现了这么一个函数:

vector<int> getVecOrder(string str) {
map<char, int> strM;
int index = 0;
vector<int> strVec;
for (int i = 0; i < str.size(); ++i) {
auto iter = strM.find(str[i]);
if (iter == strM.end()) {
strM.insert(pair<char, int>(str[i], index));
strVec.push_back(index);
index += 1;
}
else {
strVec.push_back(strM[str[i]]);
}
}
return strVec;
}

它可以依据字符串生成序列:

For example,

Given "paper", return "01023".

Given "foo", return "011".

Given "isomorphic", return "0123245607".

如今的需求也是相似的,仅仅只是更加升级了一点而已:

For example,

Given "dog cat cat dog", return "0110".
Given "dog cat cat fish", return "0112".
Given "Word Pattern", return "01".

所以就封装了例如以下函数:

vector<int> getVecOrderPro(string str) {
istringstream sstream(str);
string tempStr;
vector<string> strVec;
while (!sstream.eof()) {
getline(sstream, tempStr, ' ');
strVec.push_back(tempStr);
} map<string, int> strNumMap;
int strNumIndex = 0;
vector<int> orderNumVec;
for (int i = 0; i < strVec.size(); ++i) {
auto iter = strNumMap.find(strVec[i]);
if (iter == strNumMap.end()) {
strNumMap.insert(pair<string, int>(strVec[i], strNumIndex));
orderNumVec.push_back(strNumIndex);
strNumIndex += 1;
}
else {
orderNumVec.push_back(strNumMap[strVec[i]]);
}
}
return orderNumVec;
}

首先须要对整个长长的字符串进行依据空格进行分割,分割成的单个的字符串并加入到vector数组中。使用了流的相关函数。

后面的部分就和之前的一样了,由于是个封装好的函数了,对变量名也进行了一定的改动,前面的那个函数由此改动例如以下:

vector<int> getVecOrder(string str) {
map<char, int> charNumMap;
int charNumIndex = 0;
vector<int> orderNumVec;
for (int i = 0; i < str.size(); ++i) {
auto iter = charNumMap.find(str[i]);
if (iter == charNumMap.end()) {
charNumMap.insert(pair<char, int>(str[i], charNumIndex));
orderNumVec.push_back(charNumIndex);
charNumIndex += 1;
}
else {
orderNumVec.push_back(charNumMap[str[i]]);
}
}
return orderNumVec;
}

最后的比較例如以下,由于题目没有说pattern和str的长度一致,也就是说假设最后的索引长度不匹配了那肯定就是false了。

所以多加一行:

bool wordPattern(string pattern, string str) {
vector<int> pattern_v = getVecOrder(pattern), str_v = getVecOrderPro(str);
if (pattern_v.size() != str_v.size()) return false;
for (int i = 0; i < pattern_v.size(); ++i) {
if (pattern_v[i] != str_v[i]) return false;
}
return true;
}
updated at 2016/09/17

一点半了,大半夜的不睡觉~

没看之前写的这篇博客。只是思想应该是几乎相同的~ pattern方面还是一样,str的话就先构造出一个String数组。然后在HashMap中存储和推断String。而不是Char了。

    public boolean wordPattern(String pattern, String str) {
ArrayList s0 = getArrayOrder(pattern);
ArrayList s1 = getArrayOrder2(getArrayFromString(str));
if (s0.size() != s1.size())
return false;
for (int i = 0; i < s0.size(); i++) {
if (s0.get(i) != s1.get(i)) {
return false;
}
}
return true;
} private ArrayList getArrayOrder(String str) {
HashMap<Character, Integer> strM = new HashMap<>();
int index = 0;
ArrayList order = new ArrayList(str.length());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (strM.containsKey(c)) {
order.add(strM.get(c));
} else {
strM.put(c, index);
order.add(index);
index += 1;
}
}
return order;
} private ArrayList<String> getArrayFromString(String str) {
ArrayList<String> arrayList = new ArrayList<>();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ' && !builder.toString().equals("")) {
arrayList.add(builder.toString());
builder = new StringBuilder();
} else if (i == str.length() -1) {
builder.append(str.charAt(i));
arrayList.add(builder.toString());
builder = null;
} else {
builder.append(str.charAt(i));
}
}
return arrayList;
} private ArrayList getArrayOrder2(ArrayList<String> arrayList) {
HashMap<String, Integer> strM = new HashMap<>();
int index = 0;
ArrayList order = new ArrayList(arrayList.size());
for (int i = 0; i < arrayList.size(); i++) {
String s = arrayList.get(i);
if (strM.containsKey(s)) {
order.add(strM.get(s));
} else {
strM.put(s, index);
order.add(index);
index += 1;
}
}
return order;
}

代码

class Solution {
public:
vector<int> getVecOrder(string str) {
map<char, int> charNumMap;
int charNumIndex = 0;
vector<int> orderNumVec;
for (int i = 0; i < str.size(); ++i) {
auto iter = charNumMap.find(str[i]);
if (iter == charNumMap.end()) {
charNumMap.insert(pair<char, int>(str[i], charNumIndex));
orderNumVec.push_back(charNumIndex);
charNumIndex += 1;
}
else {
orderNumVec.push_back(charNumMap[str[i]]);
}
}
return orderNumVec;
} vector<int> getVecOrderPro(string str) {
istringstream sstream(str);
string tempStr;
vector<string> strVec;
while (!sstream.eof()) {
getline(sstream, tempStr, ' ');
strVec.push_back(tempStr);
} map<string, int> strNumMap;
int strNumIndex = 0;
vector<int> orderNumVec;
for (int i = 0; i < strVec.size(); ++i) {
auto iter = strNumMap.find(strVec[i]);
if (iter == strNumMap.end()) {
strNumMap.insert(pair<string, int>(strVec[i], strNumIndex));
orderNumVec.push_back(strNumIndex);
strNumIndex += 1;
}
else {
orderNumVec.push_back(strNumMap[strVec[i]]);
}
}
return orderNumVec;
} bool wordPattern(string pattern, string str) {
vector<int> pattern_v = getVecOrder(pattern), str_v = getVecOrderPro(str);
if (pattern_v.size() != str_v.size()) return false;
for (int i = 0; i < pattern_v.size(); ++i) {
if (pattern_v[i] != str_v[i]) return false;
}
return true;
}
};

LeetCode 290 Word Pattern(单词模式)(istringstream、vector、map)(*)的更多相关文章

  1. [LeetCode] 290. Word Pattern 单词模式

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  2. [LeetCode] 290. Word Pattern 词语模式

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  3. 290 Word Pattern 单词模式

    给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循这种模式.这里的 遵循 指完全匹配,例如在pattern里的每个字母和字符串 str 中的每个非空单词存在双向单映射关系 ...

  4. leetcode 290. Word Pattern 、lintcode 829. Word Pattern II

    290. Word Pattern istringstream 是将字符串变成字符串迭代器一样,将字符串流在依次拿出,比较好的是,它不会将空格作为流,这样就实现了字符串的空格切割. C++引入了ost ...

  5. 290. Word Pattern 单词匹配模式

    [抄题]: Given a pattern and a string str, find if str follows the same pattern. Here follow means a fu ...

  6. LeetCode 290. Word Pattern (词语模式)

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  7. LeetCode 290 Word Pattern

    Problem: Given a pattern and a string str, find if str follows the same pattern. Here follow means a ...

  8. Leetcode 290 Word Pattern STL

    Leetcode 205 Isomorphic Strings的进阶版 这次是词组字符串和匹配字符串相比较是否一致 请使用map来完成模式统计 class Solution { public: boo ...

  9. [leetcode] 290. Word Pattern (easy)

    原题 思路: 建立两个哈希表,分别保存: 1 模式 :单词 2 单词 :是否出现过 水题 /** * @param {string} pattern * @param {string} str * @ ...

随机推荐

  1. MongoDB用PCRE正则表达式

    介绍 下面说明 PCRE 所支持的正则表达式的语法和语义.Perl 文档和很多其它书中也解说了正则表达式,有的书中有很多例子.Jeffrey Friedl 写的“Mastering Regular E ...

  2. Python+Selenium练习篇之17-断言页面标题

    继续来介绍一个Selenium中页面title断言方法. 相关脚本代码如下: # coding=utf-8 import time from selenium import webdriver dri ...

  3. Jmeter-深入理解cookie,session,token

    1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应,  尤其是我不用记住是谁 ...

  4. copy & deepcopy

    1 import copy 2 3 字典参照列表结论,看是否有深层嵌套. 4 a = {'name':1,'age':2} 5 b = a 6 a['name'] = 'ff' 7 print(a) ...

  5. 菜鸟之路——机器学习之SVM分类器学习理解以及Python实现

    SVM分类器里面的东西好多呀,碾压前两个.怪不得称之为深度学习出现之前表现最好的算法. 今天学到的也应该只是冰山一角,懂了SVM的一些原理.还得继续深入学习理解呢. 一些关键词: 超平面(hyper ...

  6. maven学习(四)——maven项目构建过程

    一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----- ...

  7. DWR搭建以及使用教程

    DWR搭建以及使用教程   DWR(Direct Web Remoting)是一个Ajax的开源框架,用于改善web页面与Java类交互的远程服务器端的交互体验,可以帮助开发人员开发包含AJAX技术的 ...

  8. Python机器学习数据挖掘工具sklearn安装和使用

    python借助pip安装第三方库,所以首先确保电脑上已成功安装了pip. 安装sklearn前需要先安装numpy.scipy和pandas等库.安装的方式有两种: 一.前往python的组件库页( ...

  9. Cmake——CMake+SVN或Hg生成版本号

    CMake+SVN或Hg生成版本号 原来的CMake需要用shell脚本生成SVN版本号,再作为cmake参数传入.CMake调用脚本示例: #!/bin/sh # cmake.sh ServerCo ...

  10. LVS Mode&Method

    LVS NAT 模式: Summary: 普通的NAT模式为DNAT,即只更改目的地址,不改源端口. LVS在转发报文时,将Client的源IP透传给Server,类似于透明传输. 优点: 1. 可提 ...