1. 程式人生 > >《面試程式設計題真題合集(二)——招商銀行2019校園招聘真題題解》

《面試程式設計題真題合集(二)——招商銀行2019校園招聘真題題解》

題目描述:

給出一個正整數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(); } }