本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49717803


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:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. pattern = "abba", str = "dog dog dog dog" should return false.

思路:

(1)题意为给定一种字符样式和一个字符串,要求判断该字符串是否为给定的样式。

(2)由于给定的pattern由若干字符组成,不同的字符应该对应不同的字符串,而相同的字符应该对应相同的字符串。这样,可以通过Map对其进行实现。首先,将pattern转化为字符数组pt,将待判断的字符串转为字符串数组split;其次,如果两个数组的长度不等,则匹配失败;否则,遍历字符数组pt,如果当前字符在Map不存有,则判断待判断的字符串数组split在对应位置的值是否存于Map对应的Value中,如果存有,则匹配失败,否则,将当前位置对应的字符和字符串存入Map中;如果当前遍历的字符在Map对应的key中存有,判断key对应的value是否为空,如果不为空,则判断当前的value值和split对应的值是否相等,相等则继续,否则匹配失败;如果遍历的字符在Map对应的key中不存有,则判断value中是否存有split对应的值,如果有则匹配失败,否则将当前key和value加入Map中。

(3)详情见下方代码。希望本文对你有所帮助。

import java.util.HashMap;
import java.util.Map;

public class Word_Pattern {

	public static void main(String[] args) {
		System.err.println(wordPattern("abba", "dog dog dog dog"));
	}

	public static boolean wordPattern(String pattern, String str) {
		char[] pt = pattern.toCharArray();
		String[] split = str.split(" ");

		if (pt.length != split.length)
			return false;

		Map<Character, String> map = new HashMap<Character, String>();

		for (int i = 0; i < pt.length; i++) {
			if (!map.containsKey(pt[i])) {
				if (map.values().contains(split[i])) {
					return false;
				} else {
					map.put(pt[i], split[i]);
				}
			} else {
				if (map.get(pt[i]) != null) {
					if (map.get(pt[i]).equals(split[i])) {
						continue;
					} else {
						return false;
					}
				} else {
					if (map.values().contains(split[i])) {
						return false;
					} else {
						map.put(pt[i], split[i]);
					}
				}
			}
		}
		return true;
	}
}

Leetocde_290_Word Pattern的更多相关文章

  1. 按照Enterprise Integration Pattern搭建服务系统

    在前一篇文章中,我们已经对Enterprise Integration Pattern中所包含的各个组成进行了简单地介绍.限于篇幅(20页Word以内),我并没有深入地讨论各个组成.但是如果要真正地按 ...

  2. Enterprise Integration Pattern - 组成简介

    近些年来,越来越多的Web应用正在逐渐向大型化的方向发展.它们通常都会包含一系列相互协作的子服务.在开发过程中,如何让这些子服务协同工作常常是软件开发人员所最为头疼的问题,如各个子服务之间的数据表示不 ...

  3. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  4. 设计模式(十一):从文Finder中认识"组合模式"(Composite Pattern)

    上一篇博客中我们从从电影院中认识了"迭代器模式"(Iterator Pattern),今天我们就从文件系统中来认识一下“组合模式”(Composite Pattern).说到组合模 ...

  5. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  6. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  7. 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)

    在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...

  8. 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  9. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

随机推荐

  1. [端口扫描]S扫描器跨网段扫描

    最近看了下端口扫描,用了几款扫描器,nmap啊,x-sacn等.之前很少关注安全方面的东西,所以也比较菜. 其中有一款叫做 "S扫描器"的,扫描速度非常快,可以大网段的扫描,几十万 ...

  2. (一二九)获取文件的MineType、利用SSZipArchive进行压缩解压

    MineType 简介 文件在网络上以二进制流的方式传播,为了区分不同的文件类型,用MineType来标明. 为什么要获取 文件的拓展名较短,比较好记,但是MineType是很长的,比如docx拓展名 ...

  3. iOS集合视图单元格高亮和选中的区别

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...

  4. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  5. 关于在eclipse开发环境上打开手机data文件

    使用Eclipse开发Android上的数据库应用,需要把数据库文件放到/data/data/mynamespace/database文件夹下,普通手机通过ROOT后经常还是看不到这个文件夹,这时需要 ...

  6. springMVC系列之(三) spring+springMVC集成(annotation方式)

    个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1.Spring Spri ...

  7. Dynamics CRM2013/2015 插件注册工具登录后无法显示assembly列表问题的解决办法二

    本篇接前面的一篇博文:http://blog.csdn.net/vic0228/article/details/47079717,前篇提供了一种解决方案,将本机系统的语言切换成英文即可,今天再来介绍第 ...

  8. Linux系统调用的实现机制分析

    API/POSIX/C库的关系        系统调用的实现 3.1    系统调用处理程序 添加新系统调用 给Linux添加一个新的系统调用是件相对容易的工作.怎样设计和实现一个系统调用是难题所在, ...

  9. SVM及其c++代码运用实例

    最近做个小东西,要用到SVM,搜索网上,发现大伙都是各种介绍理论,让我等小码农晕头转向,是故自己学习总结一下,并将代码实例展示出来,方便大家共同探讨,该代码是用opencv编写的,很容易学习滴. 1. ...

  10. Libgdx 1.5.4发布,跨平台游戏开发框架

    (原文链接:http://www.libgdx.cn/topic/70/libgdx-1-5-4%E5%8F%91%E5%B8%83) [1.5.4] 添加对Titled maps 的图像层的支持. ...