java 字母金字塔_LeetCode756:金字塔转换矩阵(JAVA题解)
题目描述
现在,我们用一些方块来堆砌一个金字塔。 每个方块用仅包含一个字母的字符串表示。
使用三元组表示金字塔的堆砌规则如下:
对于三元组(A, B, C) ,“C”为顶层方块,方块“A”、“B”分别作为方块“C”下一层的的左、右子块。当且仅当(A, B, C)是被允许的三元组,我们才可以将其堆砌上。
初始时,给定金字塔的基层 bottom,用一个字符串表示。一个允许的三元组列表 allowed,每个三元组用一个长度为 3 的字符串表示。
如果可以由基层一直堆到塔尖就返回 true ,否则返回 false 。
示例1
输入:bottom = “BCD”, allowed = [“BCG”, “CDE”, “GEA”, “FFF”] 输出:true 解析: 可以堆砌成这样的金字塔: A / G E / \ / B C D 因为符合(‘B’, ‘C’, ‘G’), (‘C’, ‘D’, ‘E’) 和 (‘G’, ‘E’, ‘A’) 三种规则。
示例2
输入:bottom = “AABA”, allowed = [“AAA”, “AAB”, “ABA”, “ABB”, “BAC”] 输出:false 解析: 无法一直堆到塔尖。 注意, 允许存在像 (A, B, C) 和 (A, B, D) 这样的三元组,其中 C != D。
这个题个人感觉难度应该不算中等 属于看题解看半天都不是很懂的那种,可能我太菜了QAQ 最开始看着示例结构 想用创建赫夫曼树的方法试一下忽略了最重要的一点一个子节点可以拥有多个父节点 所以才想到用dfs遍历每一种可能的情况 代码和思路如下:
// 思路:
// 判断是否可以堆砌成金字塔取决于是否可以达到塔顶只有一个数组
// 注意1:可能存在两个字母可以组合成多种字母的情况 所以考虑用Map映射来保存规则
// 注意2: 和二叉树不同 一个节点可能有两个父节点,排除赫夫曼树做法
class Solution {
public boolean pyramidTransition(String bottom, List allowed) {
if(allowed.size() == 0) return false;
Map> map = getMap(allowed);
// System.out.println(map);
return dfs(map, bottom, "");
}
/*参数说明
*map 映射表
*boom 当前构建层的基层
*up 构建层
*/
public boolean dfs(Map> map, String boom, String up) {
if(up.length() == 1 && boom.length() == 2) return true; // 完成最后一层构建
if(up.length() == boom.length() - 1) return dfs(map, up, ""); // 开始构建下一层
int start = up.length();
int end = start + 2;
List values = map.get(boom.substring(start, end));
if(values == null) { // 没有映射关系 当前两节点构造失败
return false;
}
for(int i = 0; i < values.size(); i++) {
if(dfs(map, boom, up + values.get(i))) return true; // 试探每一种父节点的可能性,直到找到可以完整构建一行的
}
return false;
}
public Map> getMap(List allowed) { // 转换映射
Map> map = new HashMap>(); // 用String比Char方便 所以选择List
for(String s : allowed) {
String key = s.substring(0, 2); // 截取左右子块作为键
String value = s.substring(2,3);
if(map.containsKey(key)) {
map.get(key).add(value);
} else {
List values = new ArrayList();
values.add(value);
map.put(key, values);
}
}
return map;
}
}
java 字母金字塔_LeetCode756:金字塔转换矩阵(JAVA题解)相关推荐
- java函数实现进制转换与java实现八进制到十进制的转换(百练OJ:2735:八进制到十进制)
java进制转换函数介绍:Java二进制.八进制.十进制.十六进制相互转换: 二进制转十进制 Integer.parseInt("0110", 2); 八进制转十进制 Intege ...
- JAVA 如何将class文件转换成java文件
说明 若将应用部署到了服务器上或者将JAVA文件编译成了class文件之后,而原JAVA代码又因为某些原因丢失了,那么能否将Class文件转换为JAVA文件? 工具 JAVA反编译工具 jad.exe ...
- java 不允许布尔型转换int_Greenfoot / Java – 不兼容的类型:boolean不能转换为int
这里有一个新用户--我觉得我的代码错了. 我想请求帮助,因为我对Greenfoot的程序比较陌生.手头的问题如问题中所述:我在编译代码时收到"不兼容的类型"错误,无论我做什么修改, ...
- Google App Engine for Java下的URL编码转换问题
URL编码问题 此部分参考英文资料: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm http://www.w3school ...
- Java实现 LeetCode 756 金字塔转换矩阵(DFS)
756. 金字塔转换矩阵 现在,我们用一些方块来堆砌一个金字塔. 每个方块用仅包含一个字母的字符串表示. 使用三元组表示金字塔的堆砌规则如下: 对于三元组(A, B, C) ,"C" ...
- java linux urlencode_java字符编码转换研究(转)
1. 概述 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是" ...
- JAXB实现java对象与xml之间转换
一.Jaxb处理java对象和xml之间转换常用的annotation有: 1. @XmlType 2. @XmlElement 3. @XmlRootElement 4. @XmlAttribute ...
- html标签转换字符类型,java把html标签字符转换成普通字符(反转换成html标签)
package net.jasonjiang.web; import org.junit.Test; import org.springframework.web.util.HtmlUtils; /* ...
- JAVA之缓冲流,转换流和序列化流
JAVA之缓冲流,转换流和序列化流 主要内容 缓冲流 转换流 序列化流 打印流 昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流, ...
- 《LeetCode力扣练习》剑指 Offer 29. 顺时针打印矩阵 Java
<LeetCode力扣练习>剑指 Offer 29. 顺时针打印矩阵 Java 一.资源 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matr ...
最新文章
- 祁阳一中2021年高考成绩查询,祁阳一中2019高考成绩喜报、一本二本上线人数情况...
- mqtt 负载均衡_EMQ百万级MQTT消息服务(分布式集群)
- 尹成python爬虫百度云_Python爬虫实战:抓取并保存百度云资源
- ModBus的小于3.5S间隔的理解
- 在Visual Studio 2005中安装Qt 4.3.2
- 多层图,dj+dp Gym 102501A Environment-Friendly
- poto——剧院魅影——phantom of the opera
- strchr和strstr函数
- 你们一般持有几支基金?怎么管理的?
- 如何向小白讲述软件架构发展历程?
- 设计佣金问题的java程序_三角形、nextday、佣金问题实验报告.doc
- PTES Technical Guidelines
- uni-app引入阿里Icon 图标方式(CustomIcon 扩展自定义图标库)
- 萌新-以ijcai19为模板的latex排版总结
- 23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)
- mysql教程 check_Check
- python之转义字符
- 国内计算机类学术期刊投稿指南
- 无为无欲、与世无争,也就没有烦恼......
- 2021巨量千川营销通案