组合:
public class Solution { static int count = 0; static void findSo(String soFar,String rest) { if(soFar.length() == 3){ count++; System.out.println(soFar); }else{ for(int i=0; i
结果:
123124125126127134135136137145146147156157167234235236237245246247256257267345346347356357367456457467567count:35
C++版本
#include#include #include using namespace std;int count;void findSo(string soFar, string rest) { if (soFar.length() == 3) { count++; cout< <
排列:
public class Solution { static int count = 0; static void findSo(String soFar, String rest) { if (soFar.length() == 3) { count++; System.out.println(soFar); } else { for (int i = 0; i < rest.length(); i++) { String now = soFar + rest.charAt(i); String remain = rest.substring(0,i) + rest.substring(i + 1); findSo(now, remain); } } } public static void main(String[] args) { String str = "1234567"; findSo("", str); System.out.println("count:" + count); }}
for循环里面的代码也可以和组合一样
for (int i = 0; i < rest.length(); i++) { String now; if (soFar.length() < 3) { now = soFar + rest.charAt(i); } else { now = soFar; } String remain = rest.substring(0, i) + rest.substring(i + 1); findSo(now, remain); }
结果:
123124125126127132134135136137142143145146147152153154156157162163164165167172173174175176213214215216217231234235236237241243245246247251253254256257261263264265267271273274275276312314315316317321324325326327341342345346347351352354356357361362364365367371372374375376412413415416417421423425426427431432435436437451452453456457461462463465467471472473475476512513514516517521523524526527531532534536537541542543546547561562563564567571572573574576612613614615617621623624625627631632634635637641642643645647651652653654657671672673674675712713714715716721723724725726731732734735736741742743745746751752753754756761762763764765count:210
C++版本:
#include#include #include using namespace std;int count;void findSo(string soFar, string rest) { if (soFar.length() == 3) { count++; cout< <
从 m个元素中去n个元素的排列和组合差别仅仅在于
排列 string remain = rest.substr(0,i)+rest.substr(i + 1);
组合 string remain = rest.substr(i + 1);
所以组合代码也可以是:
#include#include #include using namespace std;int count;void findSo(string soFar, string rest){ if (soFar.length() == 3) { count++; cout< <
ps:
抽象的想一下 以1 2 3 4 5 6 7为例 for循环刚进来 递归肯定会得到7个 大分支 不好意思,他现在先要处理第一个分支 即("1","2,3,4,5,6,7) 在这个分支下不断的分 递归每得到一个分支就要穷尽这个分支 穷尽之后在返回到父节点的相邻分支 继续穷尽