Leetcode: Word Pattern II
2015-12-28 01:45
225 查看
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 substring in str. Examples: pattern = "abab", str = "redblueredblue" should return true. pattern = "aaaa", str = "asdasdasdasd" should return true. pattern = "aabb", str = "xyzabcxzyabc" should return false. Notes: You may assume both pattern and str contains only lowercase letters.
因为目标字符串可以任意划分,所以我们不得不尝试所有可能性。这里通过深度优先搜索的回溯法,对于pattern中每个字母,在str中尝试所有的划分方式,如果划分出来的子串可以用这个字母映射,或者可以建立一个新的字母和字符串的映射关系,我们就继续递归判断下一个pattern中的字母,直到pattern的指针和str的指针同时指到最末
技巧在于,
1. 用HashMap + HashSet来保证一一对应
2. 把HashMap和HashSet用作instance variable, 甚至boolean result也可用作instance variable, 这样任何在递归调用函数里所做的改变,都会保留,而不用把HashMap, HashSet, result加入递归argument
public class Solution { HashMap<Character, String> map = new HashMap<Character, String>(); HashSet<String> set = new HashSet<String>(); public boolean wordPatternMatch(String pattern, String str) { if (pattern==null || str==null) return false; return helper(pattern, str, 0, 0); } public boolean helper(String pattern, String str, int i, int j) { if (i==pattern.length() && j==str.length()) { return true; } if (i==pattern.length() || j==str.length()) return false; char key = pattern.charAt(i); for (int cut=j+1; cut<=str.length(); cut++) { String trial = str.substring(j, cut); if (!map.containsKey(key) && !set.contains(trial)) { // ensure one-on-one matching map.put(key, trial); set.add(trial); if (helper(pattern, str, i+1, cut)) return true; map.remove(key); set.remove(trial); } else if (map.containsKey(key) && map.get(key).equals(trial)) { if (helper(pattern, str, i+1, cut)) return true; } } return false; } }
相关文章推荐
- Qt在Linux和ARM上的环境搭建
- 2015.12.28
- Juniper SRX 1firefly-perimeter 2.1X47-D20.7 端口交换机属性配置
- 深入浅出讲解:php的socket通信
- JAVA子类方法重写父类方法
- 地理杂志精选照片
- linux基础
- 进程的通信方式
- EL隐式对象
- 地理杂志精选照片
- driver的总结
- [android]_[ListView的基本使用]
- property替换方法名
- PHP中的socket_read和socket_recv区别详解
- 【随笔】iOS9新特性介绍
- 流-到底是个啥……
- delphi中exit,abort,break,continue 的区别
- 总结报告
- linux环境隔离机制NameSpace小结
- 美图秀秀美化图片界面设计(一)