递归是一个非常经典的算法思想,很多问题都可以采用递归来解决,特别是对于树、字符串这类本身就具有递归性质的数据结构相关的问题,下面就列出几个可以用递归来解决的经典问题:
1. 字符串排列问题(不包含相同字符)
该问题要求求出字符串的所有排列,我们可以循环遍历整个字符串,将每次循环遇到的字符和第一个位置的字符交换,然后求剩下字符串的所有排列;对于剩下的字符串,重复前面的过程,所以这是个递归的过程,代码如下:
public class Solution {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] num) {
if(num == null || num.length == 0)
return result;
permutateArray(num, 0);
return result;
}
private void permutateArray(int[] num, int start){
if(start == num.length){
ArrayList<Integer> list = new ArrayList<Integer>();
for(int e : num){
list.add(e);
}
result.add(list);
return;
}
for(int i = start; i < num.length; i++){
swap(num, start, i);
permutateArray(num, start+1);
swap(num, start, i);
}
}
private void swap(int[] num, int i, int j){
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
}
LeetCode:https://oj.leetcode.com/problems/permutations/
2. 字符串排列问题(包含相同字符)
其实该问题与不包含相同字符的情况类似,只不过在上述交换字符的过程中,需要判断被交换的字符在该位置是否出现过,假如出现过,则进入下一轮循环;假如没有出现过,则交换字符;我们可以采用一个HashSet来记录在该位置出现过的字符集合,代码如下: