*[topcoder]BracketExpressions
http://community.topcoder.com/stat?c=problem_statement&pm=13243
就是能否通过把字符串中的'X'替换成"()", "[]", and "{}"来变成合法的括号字符串,
"([]X()[()]XX}[])X{{}}]"
Returns: "possible"
You can replace 'X's respectively with '{', '(', ')' and '['.
DFS搜索,Valid的判断使用stack。
- #include <stack>
- #include <vector>
- #include <string>
- using namespace std;
- class BracketExpressions {
- public:
- string candidates;
- string ifPossible(string expression)
- {
- candidates = "()[]{}";
- vector<int> xPos;
- for (int i = 0; i < expression.length(); i++)
- {
- if (expression[i] == 'X')
- {
- xPos.push_back(i);
- }
- }
- bool possible = ifPossRe(expression, 0, xPos);
- if (possible)
- return "possible";
- else
- return "impossible";
- }
- bool isValid(const string &expression)
- {
- stack<char> stk;
- for (int i = 0; i < expression.length(); i++)
- {
- if (stk.empty())
- {
- stk.push(expression[i]);
- }
- else if (match(stk.top(), expression[i]))
- {
- stk.pop();
- }
- else
- {
- stk.push(expression[i]);
- }
- }
- return stk.empty();
- }
- bool match(char a, char b)
- {
- if (a == '(' && b == ')') return true;
- if (b == '(' && a == ')') return true;
- if (a == '[' && b == ']') return true;
- if (b == '[' && a == ']') return true;
- if (a == '{' && b == '}') return true;
- if (b == '{' && a == '}') return true;
- return false;
- }
- bool ifPossRe(string &expression, int idx, vector<int> &xPos)
- {
- if (idx == xPos.size())
- {
- return isValid(expression);
- }
- int n = xPos[idx];
- for (int i = 0; i < candidates.length(); i++)
- {
- char ch = expression[n];
- expression[n] = candidates[i];
- bool res = ifPossRe(expression, idx+1, xPos);
- expression[n] = ch;
- if (res)
- return true;
- }
- return false;
- }
- };
http://apps.topcoder.com/wiki/display/tc/SRM+628
但其实判断Backet合法的代码是错的,因为没有判断先有左括号再有右括号,以下做法更好更简洁。
- bool correctBracket(string exp)
- {
- stack<char> s;
- // an assoicaitive array: opos[ ')' ] returns '(', opos[ ']' ] is '[', ...
- map<char,char> opos = {
- { ')', '(' },
- { ']', '[' },
- { '}', '{' },
- };
- for (char ch: exp) {
- // we push opening brackets to the stack
- if (ch == '(' || ch == '[' || ch == '{' ) {
- s.push(ch);
- } else {
- // If we find a closing bracket, we make sure it matches the
- // opening bracket in the top of the stack
- if (s.size() == 0 || s.top() != opos[ch]) {
- return false;
- } else {
- // then we remove it
- s.pop();
- }
- }
- }
- // stack must be empty.
- return s.empty();
- }
解法中还是用了基于6的幂来计算所有组合,比DFS要快。
- string ifPossible(string expression)
- {
- vector<int> x;
- int n = expression.size();
- for (int i = 0; i < n; i++) {
- if (expression[i] == 'X') {
- x.push_back(i);
- }
- }
- int t = x.size();
- // to easily convert to base 6 we precalculate the powers of 6:
- int p6[6];
- p6[0] = 1;
- for (int i = 1; i < 6; i++) {
- p6[i] = 6 * p6[i - 1];
- }
- const char* CHARS = "([{)]}";
- for (int m = 0; m < p6[t]; m++) {
- string nexp = expression;
- for (int i = 0; i < t; i++) {
- // (m / p6[i]) % 6 extracts the i-th digit of m in base 6.
- nexp[ x[i] ] = CHARS[ (m / p6[i]) % 6 ];
- }
- if (correctBracket(nexp)) {
- return "possible";
- }
- }
- return "impossible";
- }
*[topcoder]BracketExpressions的更多相关文章
- topcoder SRM 628 DIV2 BracketExpressions
先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> # ...
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
随机推荐
- Flex-box 学习
.flex-cont{ /*定义为flexbox的“父元素”*/ display: -webkit-box; display: -webkit-flex; display: flex; /*子元素沿主 ...
- yum被锁定
使用Yum的时候 提示yum被搜定了 . Another app is currently holding the yum lock; waiting for it to exit... 解决办法 ...
- jquery.tmpl.min.js--前端实现模版--数据绑定--详解
动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等. 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在 ...
- 基于CSS3新属性Animation及transform实现类似翻书效果
注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写 先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0) 类似翻书效果,原本 ...
- php正则表达式总结第1弹
介绍几个我用到的php正则表达式 1. 一篇文章的链接,我需要去掉以 /hotels/打头的链接,可用下面正则 $content = preg_replace('/<a(.*?)href=&qu ...
- Delphi XE5教程5:程序的结构和语法
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- iOS网络编程同步GET方法请求编程
iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 首先实现查询业务,查询业务请求可以在主视图控制器 ...
- 在myeclipse中使用Java语言进行spark Standalone模式应用程序开发
一.环境配置 Myeclipse中虽然已经集成了maven插件,但是由于这个插件版本较低,建立maven project会出现错误. 解决办法:自己到官网http://maven.apache.org ...
- 屏蔽ios7中某个页面的默认手势滑回返回
- (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:YES];self.navigationController.in ...
- Halcon学习笔记之缺陷检测(一)
例程:surface_scratch.hdev 说明:这个程序利用局部阈值和形态学处理提取表面划痕 代码中绿色部分为个人理解和注释,其余为例程中原有代码 *surface_scratch.hdev:e ...