个人主页:http://guanzi.info
题目:
编程实现所有括号的合法匹配。实例如下:
输入 3
输出 ((())) (()()) (())() ()(()) ()()()
解题思路:
学名为:深度优先搜索(DFS) 这是看别人的文章得到的名称。。。
代码如下:
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include <vector>
#include <string>
using namespace std;
void func(int left, int right , vector<char>& str){
if( left != 0 ){
str.push_back( '(' );
func( left-1, right, str);
str.pop_back();
}
if ( right != 0){
if ( left < right){
str.push_back( ')' );
func( left, right-1, str);
str.pop_back();
}
}
if ( right == 0 ){
for( int i = 0; i < str.size(); i++)
cout << str[i];
cout << endl;
}
return;
}
int main( ){
int n;
vector<char> str;
cin >> n;
func( n, n, str);
return 1;
}
程序运行状态解释如下:
输入 3
函数调用栈如下
step1:
func(3,3) push( “(” 调用func(2, 3)
step2:
func(2,3) push ( “((” 调用func(1, 3)
func(3,3)
step3:
func(1,3) push ( “(((” 调用func(0, 3)
func(2,3)
func(3,3)
step4:
func(0,3) push) “((()” 调用func(0, 2)
func(1,3)
func(2,3)
func(3,3)
...此处不再赘述
step7:
func(0,0) print “((()))” return
func(0,1)
func(0,2)
func(0,3)
func(1,3)
func(2,3)
func(3,3)
接下来这一步是看懂这个递归的重点
step8:
func(0,1) pop “((())” return
func(0,2)
func(0,3)
func(1,3)
func(2,3)
func(3,3)
step9:
func(0,2) pop “((()” return
func(0,3)
func(1,3)
func(2,3)
func(3,3)
step10:
func(0,3) pop “(((” return
func(1,3)
func(2,3)
func(3,3)
此处的处理是第二个重点。程序开始第二次遍历
step11:
func(1,3) pop “((” push) “(()” 调用func(1, 2)
func(2,3)
func(3,3)
step12:
func(1,2)push( “(()(” 调用func(0, 2)
func(1,3)
func(2,3)
func(3,3)
此处省略部分步骤
step k:
func(0,0)print “(()())” return
func(0,1)
func(0,2)
func(1,2)
func(1,3)
func(2,3)
func(3,3)
继续省略一些过程
step l:
func(2,3)pop “(” push) “()” 调用func(2, 2)
func(3,3)