Recursive-Brace Expansion II
2019-11-26 11:05:10
- 1096. Brace Expansion II
问题描述:

问题求解:
经典的字符串扩展问题。
一般来说这种问题有两种解法,一个是采用stack,一个是采用recursive。事实证明,这种题目采用recursive在时间效率和程序易读性上要远远高于stack,请尽量采用recursive。
本题有个很好的讲解视频:https://www.youtube.com/watch?v=blXuT7DOMwU
public List<String> braceExpansionII(String expression) {
List<String> res = new ArrayList<>();
if (expression.length() <= 1) {
res.add(expression);
return res;
}
if (expression.charAt(0) == '{') {
int cnt = 0;
int idx = 0;
for (; idx < expression.length(); idx++) {
if (expression.charAt(idx) == '{') cnt += 1;
if (expression.charAt(idx) == '}') cnt -= 1;
if (cnt == 0) break;
}
List<String> strs = helper(expression.substring(1, idx));
HashSet<String> set = new HashSet<>();
for (String str : strs) {
List<String> tmp = braceExpansionII(str);
set.addAll(tmp);
}
List<String> rest = braceExpansionII(expression.substring(idx + 1));
for (String str1 : set) {
for (String str2 : rest) {
res.add(str1 + str2);
}
}
}
else {
String prev = expression.charAt(0) + "";
int idx = 0;
List<String> rest = braceExpansionII(expression.substring(1));
for (String s : rest) res.add(prev + s);
}
Collections.sort(res);
return res;
}
public List<String> helper(String s) {
List<String> res = new ArrayList<>();
int cnt = 0;
int i = 0;
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == ',') {
if (cnt == 0) {
res.add(s.substring(i, j));
i = j + 1;
}
}
else if (s.charAt(j) == '{') cnt += 1;
else if (s.charAt(j) == '}') cnt -= 1;
}
res.add(s.substring(i));
return res;
}
同类题:
- 1106. Parsing A Boolean Expression
问题描述:

问题求解:
没过几天又一次在hard区看到类似的题目,这次的题目我认为就是上面的题目换了一个说法,而且相对来说更加简单了。
果然,直接使用recursive就ac了。
public boolean parseBoolExpr(String expression) {
if (expression.length() == 1) {
return expression.charAt(0) == 't' ? true : false;
}
char first = expression.charAt(0);
if (first == '!') return !parseBoolExpr(expression.substring(2, expression.length() - 1));
List<String> strs = helper(expression.substring(2, expression.length() - 1));
boolean res = false;
if (first == '|') {
for (String str : strs) {
if (parseBoolExpr(str)) res = true;
}
}
else {
res = true;
for (String str : strs) {
if (!parseBoolExpr(str)) res = false;
}
}
return res;
}
private List<String> helper(String s) {
List<String> res = new ArrayList<>();
int cnt = 0;
int i = 0;
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == '(') cnt += 1;
if (s.charAt(j) == ')') cnt -= 1;
if (s.charAt(j) == ',' && cnt == 0) {
res.add(s.substring(i, j));
i = j + 1;
}
}
res.add(s.substring(i));
return res;
}
Recursive-Brace Expansion II的更多相关文章
- LeetCode 1087. Brace Expansion
原题链接在这里:https://leetcode.com/problems/brace-expansion/ 题目: A string S represents a list of words. Ea ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
- vim_action
读取文件,显示行号 nl -a.txt brace expansion 花括号扩展 echo a{A{1,2},B{3,4}}b mkdir {2009...2011}-0{1...9} {2009. ...
- SH Script Grammar
http://linux.about.com/library/cmd/blcmdl1_sh.htm http://pubs.opengroup.org/onlinepubs/9699919799/ut ...
- oracle已知会导致错误结果的bug列表(Bug Issues Known to cause Wrong Results)
LAST UPDATE: 1 Dec 15, 2016 APPLIES TO: 1 2 3 4 Oracle Database - Enterprise Edition - Versi ...
- CentOS 7.4 初次手记:第三章 CentOS基础了解
第三章 CentOS基础了解... 36 第一节 语言编码.终端... 36 I 查看语言编码... 36 II Tty?.pts/?. 36 第二节 bash/sh command. 38 I 查找 ...
- man bash
BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [ ...
- bash5.0参考手册
Bash Reference Manual a.summary-letter { text-decoration: none } blockquote.indentedblock { margin-r ...
- Here String 中不该进行分词
我们知道,在 Shell 中,一个变量在被展开后,如果它没有被双引号包围起来,那么它展开后的值还会进行一次分词(word splitting,或者叫拆词,分词这个术语已经被搜索引擎相关技术占用了)操作 ...
随机推荐
- Java的锁机制--synchronsized关键字
引言 高并发环境下,多线程可能需要同时访问一个资源,并交替执行非原子性的操作,很容易出现最终结果与期望值相违背的情况,或者直接引发程序错误. 举个简单示例,存在一个初始静态变量count=0,两个线程 ...
- iOS适配UIViewView/WKWebView,H5生成长图,仿微信进度条
前段时间撸代码猥琐发育的时候,设计师老王给了张截图某宝APP上一个生成长图分享的功能,正好公司有这个需求,于是在立马开始操练起来!在万能的度娘上搜集整理资料后发现很多文章介绍的方案对WKWebView ...
- Cisco2960 交换机密码破解方法
1. 启用超级终端并出现连接界面2. 拔掉交换机的电源3. 按下交换机上的 Mode按钮, 与此同时重新插上交换机的电源线4. 当交换机左边的sys 灯会慢慢的闪动, ( 细心的话会发现部分灯红色的闪 ...
- LNMP环境搭建--Centos7
LNMP环境搭建--Centos7 | 刘鹏--博客 盒子 盒子 博客 分类 搜索 文章目录 在Centos7环境安装LAMP环境,备忘哈哈. 准备 首先去官网下载php,nginx 编译安装php ...
- epoll的原理和用法
设想一个场景,有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收到TCP包)也就是说,在每一时刻进程只需要处理这100万连接中的一小部分连接,那么,如何 ...
- marquee用到的属性
一.marquee标签的几个重要属性: 1.direction:滚动方向(包括4个值:up.down.left.right) 说明:up:从下向上滚动:down:从上向下滚动:left:从右向左滚 ...
- 一起了解 .Net Foundation 项目 No.9
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. DLR/IronPytho ...
- Manjaro 19.01 kde下Tim sogou软件安装问题及解决
我的系统配置 首先第一个问题是,在manjaro下Tim Thunderspeed这种deepin-wine的软件.今天我在装这些软件的时候,安装之后不能打开,闪退.苦恼了我好一会儿.终于找到了解决的 ...
- Android开发 run的时候出现waiting for debugger的情况,及解决问题
出现原因:不清楚,大概推测是因为缓存没有清除干净 解决方法: 方法一. 重新启动模拟器 好像就点右上角的x符号是没有用的,因为会保存状态,在关闭之后还要点击Cold Boot Now,冷启动,才会把之 ...
- vue-router03 vue-cli
1.钩子: next讲解: next()进行路由跳转 next(false)取消路由跳转 beforeRouteEnter (to, from, next) { next(vm => { // ...