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。

  1. #include <stack>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5.  
  6. class BracketExpressions {
  7. public:
  8. string candidates;
  9.  
  10. string ifPossible(string expression)
  11. {
  12. candidates = "()[]{}";
  13. vector<int> xPos;
  14. for (int i = 0; i < expression.length(); i++)
  15. {
  16. if (expression[i] == 'X')
  17. {
  18. xPos.push_back(i);
  19. }
  20. }
  21. bool possible = ifPossRe(expression, 0, xPos);
  22. if (possible)
  23. return "possible";
  24. else
  25. return "impossible";
  26. }
  27.  
  28. bool isValid(const string &expression)
  29. {
  30. stack<char> stk;
  31. for (int i = 0; i < expression.length(); i++)
  32. {
  33. if (stk.empty())
  34. {
  35. stk.push(expression[i]);
  36. }
  37. else if (match(stk.top(), expression[i]))
  38. {
  39. stk.pop();
  40. }
  41. else
  42. {
  43. stk.push(expression[i]);
  44. }
  45. }
  46. return stk.empty();
  47. }
  48.  
  49. bool match(char a, char b)
  50. {
  51. if (a == '(' && b == ')') return true;
  52. if (b == '(' && a == ')') return true;
  53. if (a == '[' && b == ']') return true;
  54. if (b == '[' && a == ']') return true;
  55. if (a == '{' && b == '}') return true;
  56. if (b == '{' && a == '}') return true;
  57. return false;
  58. }
  59.  
  60. bool ifPossRe(string &expression, int idx, vector<int> &xPos)
  61. {
  62. if (idx == xPos.size())
  63. {
  64. return isValid(expression);
  65. }
  66. int n = xPos[idx];
  67. for (int i = 0; i < candidates.length(); i++)
  68. {
  69. char ch = expression[n];
  70. expression[n] = candidates[i];
  71. bool res = ifPossRe(expression, idx+1, xPos);
  72. expression[n] = ch;
  73. if (res)
  74. return true;
  75. }
  76. return false;
  77. }
  78. };

http://apps.topcoder.com/wiki/display/tc/SRM+628

但其实判断Backet合法的代码是错的,因为没有判断先有左括号再有右括号,以下做法更好更简洁。

  1. bool correctBracket(string exp)
  2. {
  3. stack<char> s;
  4. // an assoicaitive array: opos[ ')' ] returns '(', opos[ ']' ] is '[', ...
  5. map<char,char> opos = {
  6. { ')', '(' },
  7. { ']', '[' },
  8. { '}', '{' },
  9. };
  10. for (char ch: exp) {
  11. // we push opening brackets to the stack
  12. if (ch == '(' || ch == '[' || ch == '{' ) {
  13. s.push(ch);
  14. } else {
  15. // If we find a closing bracket, we make sure it matches the
  16. // opening bracket in the top of the stack
  17. if (s.size() == 0 || s.top() != opos[ch]) {
  18. return false;
  19. } else {
  20. // then we remove it
  21. s.pop();
  22. }
  23. }
  24. }
  25. // stack must be empty.
  26. return s.empty();
  27. }

解法中还是用了基于6的幂来计算所有组合,比DFS要快。

  1. string ifPossible(string expression)
  2. {
  3. vector<int> x;
  4. int n = expression.size();
  5. for (int i = 0; i < n; i++) {
  6. if (expression[i] == 'X') {
  7. x.push_back(i);
  8. }
  9. }
  10. int t = x.size();
  11.  
  12. // to easily convert to base 6 we precalculate the powers of 6:
  13. int p6[6];
  14. p6[0] = 1;
  15. for (int i = 1; i < 6; i++) {
  16. p6[i] = 6 * p6[i - 1];
  17. }
  18.  
  19. const char* CHARS = "([{)]}";
  20. for (int m = 0; m < p6[t]; m++) {
  21. string nexp = expression;
  22. for (int i = 0; i < t; i++) {
  23. // (m / p6[i]) % 6 extracts the i-th digit of m in base 6.
  24. nexp[ x[i] ] = CHARS[ (m / p6[i]) % 6 ];
  25. }
  26. if (correctBracket(nexp)) {
  27. return "possible";
  28. }
  29. }
  30.  
  31. return "impossible";
  32. }

  

*[topcoder]BracketExpressions的更多相关文章

  1. topcoder SRM 628 DIV2 BracketExpressions

    先用dfs搜索所有的情况,然后判断每种情况是不是括号匹配 #include <vector> #include <string> #include <list> # ...

  2. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  3. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  4. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  5. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  6. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  7. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  8. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  9. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

随机推荐

  1. Flex-box 学习

    .flex-cont{ /*定义为flexbox的“父元素”*/ display: -webkit-box; display: -webkit-flex; display: flex; /*子元素沿主 ...

  2. yum被锁定

    使用Yum的时候 提示yum被搜定了 . Another app is currently holding the yum lock; waiting for it to exit...   解决办法 ...

  3. jquery.tmpl.min.js--前端实现模版--数据绑定--详解

    动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等. 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在 ...

  4. 基于CSS3新属性Animation及transform实现类似翻书效果

    注:本实例JS部分均以原生JS编写,不善用原生JS的,可用jQuery等对三方框架改写 先上效果图:(样式有点丑,可以忽略一下下,效果出来了就好,后期加到其他项目中方便更改0.0) 类似翻书效果,原本 ...

  5. php正则表达式总结第1弹

    介绍几个我用到的php正则表达式 1. 一篇文章的链接,我需要去掉以 /hotels/打头的链接,可用下面正则 $content = preg_replace('/<a(.*?)href=&qu ...

  6. Delphi XE5教程5:程序的结构和语法

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  7. iOS网络编程同步GET方法请求编程

    iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 首先实现查询业务,查询业务请求可以在主视图控制器 ...

  8. 在myeclipse中使用Java语言进行spark Standalone模式应用程序开发

    一.环境配置 Myeclipse中虽然已经集成了maven插件,但是由于这个插件版本较低,建立maven project会出现错误. 解决办法:自己到官网http://maven.apache.org ...

  9. 屏蔽ios7中某个页面的默认手势滑回返回

    - (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:YES];self.navigationController.in ...

  10. Halcon学习笔记之缺陷检测(一)

    例程:surface_scratch.hdev 说明:这个程序利用局部阈值和形态学处理提取表面划痕 代码中绿色部分为个人理解和注释,其余为例程中原有代码 *surface_scratch.hdev:e ...