《面试编程题真题合集(二)——招商银行2019校园招聘真题题解》

一、寻找合法字符串
此题是leetcode原题:https://leetcode.com/problems/generate-parentheses/description/


题目描述:

给出一个正整数n,请给出所有的包含n个‘(’和n个‘)’的字符串,使得’(‘he’)’可以完全匹配。
例如:
‘(())()’,’()()()’都是合法的;’())()(‘是不合法的。
请按照字典序给出所有合法的字符串
输入描述:
输入为一个正整数
输出描述:
输出为所有合法的字符串,用英文逗号隔开
示例1:
输入
2
输出
(()),()()


解题思路:

假设我们从左到右生成一个合法的括号配对字符串,在生成不同的括号配对时,要注意以下几个问题:
1、字符串最左边的括号一定是”(“,最右边的括号一定是”)”
2、在生成合法的字符串配对时,我们可以考虑这样插入新的括号:
a)如果当前左括号数left大于右括号数right,那么此时我们再插入一个”(“或”)”都是能保证合法配对的
b)如果当前左括号数left等于右括号数right,那么下一个即将插入的括号一定是”(“才能保证配对合法
c)如果当前左括号数left已经等于num,即左括号全部已生成,则只需在后面补完所有剩下的”)”就可以了
注意:左括号一定是最先全部生成的


java代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
    /**
     * 招商银行2019春招---寻找字合法字符串
     * @param parenthese
     * @param num 左右括号对数
     * @param left 已生成的左括号数,left<=num
     * @param right 已生成的 右括号数,right<=num
     * @return
     */

    public static List<String> generate(String parenthese,int num,int left,int right){
        List<String> result = new ArrayList<String>();
        //在左括号未用完时
        if(left < num){
            //生成的左括号数大于右括号数,则下一个括号可以为左括号,
            也可以为右括号
            if(left>right){
                //下一个生成左括号
                result.addAll(generate2(parenthese+"(",num,left+1,right));
                //下一个生成右括号
                result.addAll(generate2(parenthese+")",num,left,right+1));
            }
            else{//左括号数和右括号数相同时,一定是添加左括号
                result.addAll(generate2(parenthese+"(",num,left+1,right));
            }
        }
        if(left==num &&right<num){
            for(int i=right+1;i<=num;i++)
                parenthese += ")";
            right = num;
            result.add(parenthese);
        }
        return result;
    }
    public static void main(String[] args){
        Scanner reader = new Scanner(System.in);
        int num = Integer.parseInt(reader.nextLine());  //输入括号的对数
        List<String> result =generate2("", num, 0, 0);
        for(int i=0;i<result.size();i++){
            if(i==result.size()-1)
                System.out.print(result.get(i));
            else
                System.out.print(result.get(i)+",");
        }
        reader.close();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值