📣 独立日限时特惠: VIP通行证立减$68
查看: 3803| 回复: 21
跳转到指定楼层
上一主题 下一主题
收起左侧

求思路,这个题实在没思路了

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
Implement an algorithm to print all valid (e g , properly opened and closed) combi-nations of n-pairs of parentheses
EXAMPLE:
input: 3 (e g , 3 pairs of parentheses)
output: ()()(), ()(()), (())(), ((()))

我知道要用到递归,但具体怎么就列举全部情况了???


上一篇:【已崩溃】楼主换mac,python里面的module装不上
下一篇:求本书Elements of Programming Interviews:300 Questions and Solutions
🔗
zercal 2013-6-17 03:56:47 | 只看该作者
全局:
大概就是这样,不要在意太多细节:

bool  make(string &res)
{
      int len = res.size();
      if (len > n)
      {
             return true;
      }
      if could add left
      {
                res += "(";
                make(res);
                res.pop();
      }
      if  could add right
           .....
      return true
}
回复

使用道具 举报

🔗
Isaac 2013-6-17 03:56:55 | 只看该作者
全局:
只要顺序正确,怎么插都行吧
回复

使用道具 举报

🔗
xutopia 2013-6-17 05:37:36 | 只看该作者
全局:
'('开头,然后递归出所有n-1对括号的情况,每种情况在所有能插入')'的地方插入')'

给定任意一种n对括号的组合,第一个肯定是'(',把第一个'('和与它对应的')'去掉得到一个n-1对括号的组合,by induction你能把它递归出来,然后因为你在所有能插入')'的地方都试着插入')'了,所以你肯定能生成原先给定的组合。
回复

使用道具 举报

🔗
 楼主| reeeelan 2013-6-17 05:59:20 | 只看该作者
全局:
本帖最后由 reeeelan 于 2013-6-17 06:03 编辑

public static void main(String args[])
        {
                String s="((((";
                insert(s);
        }
        public static void insert(String s)
        {
                char arr[]=s.toCharArray();
                LinkedList<Character> ll=new LinkedList<Character>();
                for(int x=0; x<arr.length; x++)
                {
                        for(int i=0; i<x+1; i++)
                        {
                                ll.add(arr);
                                
                        }
                        for(int i=0; i<x+1; i++)
                        {
                                ll.add(')');
                                
                        }
                        for(int j=0; j<ll.size(); j++)
                        {
                                System.out.print(ll.get(j));
                        }
                        System.out.println();
                }
        }

找别的大哥,给了个解法,可还是没打到最终要求,这个该怎么修改啊
回复

使用道具 举报

🔗
北美农民 2013-6-17 07:49:58 | 只看该作者
全局:
本帖最后由 北美农民 于 2013-6-16 18:52 编辑

假设n对括号, 那么我们要从左至右做n*2次决策(放n*2个括弧从 1 to 2*n)。然而每一次决策是有限制的:即在任意一个位置上,之前左括号的数目必须大于等于右括号, 如果小于那么违法。用一个标记flag判断,初始=0, 每次有两个决策:加左括号flag+1; 加右括号-1, 每次进行下去的判断条件是flag>=0 并且 flag<=n...实现很简单
回复

使用道具 举报

🔗
rogerdai 2013-6-19 01:00:40 | 只看该作者
全局:
用python写了一个,楼主看看符合要求吗?
  1. # input: number of left brackets
  2. # output: all combinations
  3. input_number = 3
  4. def recursive_combination(num_left, input_str, num_right):
  5.     if (num_left < 0 or num_right < 0):
  6.         return
  7.     if (num_left > 0):
  8.         recursive_combination(num_left-1, input_str+'(', num_right)
  9.         if (num_left < num_right):
  10.             recursive_combination(num_left, input_str+')', num_right-1)
  11.     elif (num_right > 0):
  12.         if (num_left < num_right):
  13.             recursive_combination(num_left, input_str+')', num_right-1)
  14.     else:
  15.         # should terminate
  16.         print input_str
  17.         return

  18. recursive_combination(input_number-1, '(', input_number)
复制代码


回复

使用道具 举报

🔗
 楼主| reeeelan 2013-6-20 00:39:35 | 只看该作者
全局:
有那么点意思,谢了啊
回复

使用道具 举报

🔗
ytsr 2013-6-23 15:00:26 | 只看该作者
全局:
你这例子的答案少了一个
(()())
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表