leetcode [290] - Word Pattern
时间:2019-06-17
本文章向大家介绍leetcode [290] - Word Pattern,主要包括leetcode [290] - Word Pattern使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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
.
Example 1:
Input: pattern ="abba"
, str ="dog cat cat dog"
Output: true
Example 2:
Input:pattern ="abba"
, str ="dog cat cat fish"
Output: false
Example 3:
Input: pattern ="aaaa"
, str ="dog cat cat dog"
Output: false
Example 4:
Input: pattern ="abba"
, str ="dog dog dog dog"
Output: false
题目大意:
给定两个字符串pattern和str,根据pattern给定的规律,判断str是否也遵循该规律。
理 解:
看到题目示例会误解为只需判断pattern是对此还是全等,这是错误的。
其实,这个题目和之前的一个字符串中字符替换的题目类似。只是,这里是单词替换字符。
用map保存字符和单词的映射关系。用set保存已被映射的单词以防不同字符映射到同一单词。
先将str中的单词分割存放在vector中,若vector的大小和pattern的长度不等,则返回false。
遍历pattern,当前字符pattern[i] 若未出现,则判断对应的单词是否出现,已出现则 false;否则添加该映射至map中。
若当前字符pattern[i] 已出现,判断当前对应单词与map中映射的单词是否一致,一致继续遍历,否则,返回false。
代 码 C++:
class Solution { public: bool wordPattern(string pattern, string str) { vector<string> splitWords; // 分割str为单词 int startPos=0,blankPos; // 记录单词的起始位置、空格的位置 string word; // 存放单词 map<char, string> m; // 存放两字符串间的映射关系 map<char, string>::iterator it; set<string> m_set; // 防止多个字符映射至同一单词 int i = 0; // 遍历 while ((blankPos = str.find(' ', startPos))!=str.npos) { word = str.substr(startPos, blankPos-startPos); // 起始位置和长度 splitWords.push_back(word); startPos = blankPos + 1; } // 处理最后一个单词 if (startPos < str.length()) { word = str.substr(startPos); splitWords.push_back(word); } if (pattern.length() != splitWords.size()) return false; while (pattern[i] != '\0') { it = m.find(pattern[i]); if (it == m.end()) { if (m_set.find(splitWords[i]) == m_set.end()) { m_set.insert(splitWords[i]); } else { return false; } m.insert(pair<char, string>(pattern[i], splitWords[i])); i++; } else { if (strcmp((it->second).c_str(), splitWords[i].c_str()) == 0) i++; else return false; } } return true; } };
运行结果:
执行用时 :4 ms, 在所有C++提交中击败了94.12%的用户
内存消耗 :8.9 MB, 在所有C++提交中击败了5.10%的用户
原文地址:https://www.cnblogs.com/lpomeloz/p/11026962.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在 Linux 上用 DNS 实现简单的负载均衡的方法
- centos7.2.1511安装jdk1.8.0_151及mysql5.6.38的方法
- Linux CentOS使用crontab设置定时重启的方法
- centos安装php5、卸载php、安装php7的教程
- centos7中crontab定时计划任务5分钟一次命令写法
- Ubuntu16.04 安装Teamviewer的教程详解
- 01 . OpenResty简介部署,优缺点,压测,适用场景及用Lua实现服务灰度发布
- 详解Linux iptables 命令
- 详解fedora 开启 apache 并 开启目录浏览模式
- CentOS新建用户并使能密钥登录的方法
- Linux系统扩容根目录磁盘空间的操作方法
- Linux如何查看进程栈信息示例
- linux查看硬盘大小与挂载硬盘的实现
- centos6.5 安装hadoop1.2.1的教程详解【亲测版】
- Linux中没有rc.local文件的完美解决方法