第四题“逐步生成结果”之非数值型问题。
package 第七章递归知识讲解; import java.util.HashSet; import java.util.Set; /** * 7.5 “逐步生成结果”之非数值型问题 * @author MZFAITHDREAM * */ public class 递归4 { //递归 public static Set<String> kuohao1(int m){ Set<String> s_M=new HashSet<>(); //因为set可以去重复 if(m==1) { s_M.add("()"); return s_M; } Set<String> set_m_1=kuohao1(m-1); //调m-1层,添加元素 for (String s : set_m_1) { s_M.add("()"+s); s_M.add(s+"()"); s_M.add("("+s+")"); } return s_M; } //迭代 public static Set<String> kuohao2(int m){ Set<String> res=new HashSet<>(); res.add("()"); if(m==1) return res; for (int i = 2; i <=m; i++) { Set<String> res_new=new HashSet<>(); //创建一个新的集合用于存储上一个集合更新后的结果 for (String s : res) { //添加 res_new.add("()"+s); res_new.add(s+"()"); res_new.add("("+s+")"); } res=res_new; //更新集合 } return res; } public static void main(String[] args) { Set<String> kuohao1 = kuohao1(8); for (String s : kuohao1) { System.out.print(s+" "); } System.out.println(); Set<String> kuohao2 = kuohao2(3); for (String s : kuohao2) { System.out.print(s+" "); } } }
第五题 子集生成
package 第七章递归知识讲解; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; /** * 7.6 子集生成 * @author MZFAITHDREAM * 给定一个数组A和数组的大小int n,请返回A的所有非空子集。 * */ /** * 2的n次方-1 * arr目标数组 * cur:数组下标1 * @author MZFAITHDREAM * */ public class 递归6 { public static void main(String[] args) { 递归6 obj=new 递归6(); int[] a= {1,2,3}; Set<Set<Integer>> subSets=obj.getSubset(a,a.length); System.out.println(subSets); } public Set<Set<Integer>> getSubset(int[] a,int n){ return solve(a,n,n-1); } private static Set<Set<Integer>> solve(int[] a, int n, int cur) { /** * 下面是大集合 * 对每一个元素 建立集合 */ Set<Set<Integer>> newset=new HashSet<>(); /** * 判断 */ if(cur==0) { Set<Integer> nil=new HashSet<>();//空集 Set<Integer> first=new HashSet<>();//第一个元素 first.add(a[0]); newset.add(nil); newset.add(first); return newset; } // 大集合里面 Set<Set<Integer>> oldset=solve(a,n,cur-1); for(Set<Integer> set:oldset){ //对于每个子集cur下标对应的元素可以加进去也可以不加进去 newset.add(set);//保留原样 Set<Integer> clone=(Set<Integer>)((HashSet)set).clone();//拷贝set clone.add(a[cur]);//添加当前元素 newset.add(clone); } return newset; } }
第六题子集生成之二进制法。
package 第七章递归知识讲解; import java.util.HashSet; import java.util.Set; /** * 7.6 子集生成之二进制法 * @author MZFAITHDREAM * * */ public class 递归7 { private static Set<Set<Integer>> newSet; public static void main(String[] args) { // 调用自己定义的方法 int [] A= {123,456,789}; Set<Set<Integer>> set=new 递归7().getSubset(A, A.length); System.out.println(set); } public static Set<Set<Integer>> getSubset(int[] A,int n){ return solve(A,n,n-1); } /** * 递归增量构造法 * @param A * @param n * @param cur * @return */ private static Set<Set<Integer>> solve(int[] A, int n, int cur) { if(cur==0) {//处理第一个元素 // null Set<Integer> nil=new HashSet(); // fist Set<Integer> fist=new HashSet(); fist.add(A[0]); newSet.add(nil); newSet.add(fist); try { Set<Set<Integer>> oldSet =getSubset(A, n); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Set<Set<Integer>> newSet =new HashSet(); for (Set<Integer> set : newSet) { // 对于每个子集,cur这个元素可以加进去,也可以不加进去 newSet.add(set);//保留原样 // set转为HashSet Set<Integer>clone= (Set<Integer>) ((HashSet)set).clone(); // 上面是技术克隆 clone.add(A[cur]); //增加元素 newSet.add(clone); } return newSet; } return newSet; } }
7.7 子集生成之二进制法。
package 第七章递归知识讲解; import java.util.HashSet; import java.util.Set; /** * 7.7 子集生成之二进制法 * @author MZFAITHDREAM * *2的n次方-1 */ public class 递归71 { public static void main(String[] args) { Object[] arr = {1,2,3}; Set<Set<Object>> subSets = getSubSets( arr,arr.length-1); subSets.remove(new HashSet<Object>());//移除空集 System.out.println(subSets); } /* * arr:目标数组 * cur:正在操作的数组元素下标 */ public static Set<Set<Object>> getSubSets(Object[] arr,int cur) { //当前元素对应的结果, Set<Set<Object>> newSet = new HashSet<Set<Object>>(); if(cur == 0) { Set<Object> nil = new HashSet<Object>();//借助空集 Set<Object> first = new HashSet<Object>();//只包含第一个元素的子集 first.add(arr[cur]); newSet.add(nil); newSet.add(first); return newSet; } //上一个元素的结果 Set<Set<Object>> oldSet = getSubSets(arr,cur-1); for (Set<Object> set : oldSet) { newSet.add(set); Set<Object> temp = new HashSet<Object>(set); temp.add(arr[cur]); newSet.add(temp); } return newSet; } /** * //递推实现: * @param args */ public static void main1(String[] args) { Object[] arr = {"c","d","a"}; Set<Set<Object>> subSets = getSubSets( arr,arr.length-1); subSets.remove(new HashSet<Object>()); System.out.println(subSets); } /* arr:目标数组 * cur:正在操作的数组元素下标 */ public static Set<Set<Object>> getSubSets1(Object[] arr,int cur) { //当前元素对应的结果, Set<Set<Object>> res_set = new HashSet<Set<Object>>(); res_set.add(new HashSet<Object>()); for (Object i : arr) { Set<Set<Object>> tempSet = new HashSet<Set<Object>>(); tempSet.addAll(res_set); for (Set<Object> set : res_set) { Set<Object> temp = new HashSet<Object>(set); temp.add(i); tempSet.add(temp); } res_set = tempSet; } return res_set; } }
第八题:全排列(上)
package 第七章递归知识讲解; import java.util.ArrayList; /** * 7.8 全排列(上) * @author MZFAITHDREAM *给定一个字符串String s = "abc";求s的全排列 递归实现: 对于字符串s的全排列可以再s.length()-1的字符串全排列基础上放左边,放右边和放中间几种方式实现 */ import java.util.HashSet; import java.util.Set; public class 递归8 { public static void main(String[] args) { Set<String>res=new 递归8().getPermutations("ab"); System.out.println(res); System.out.println("----------------------全排列方式------------------------------------"); Set<String>re=new 递归8().getPermutations1("abc"); System.out.println(re); } /** * *全排列 * @param str * @return */ public static Set<String> getPermutations1(String str) { //当前元素对应的结果, Set<String> res_set = new HashSet<String>(); // 判断长度==1 if(str.length()==1) { res_set.add(str); return res_set; } //字符串长度-1的全排列 Set<String> pre_set = getPermutations1(str.substring(0,str.length()-1)); String addStr = str.charAt(str.length()-1)+"";//需要添加的字符串 for (String s : pre_set) { //放左边 String tempStr = addStr+s; res_set.add(tempStr); //放右边 tempStr = s+addStr; res_set.add(tempStr); //放中间 for (int j = 1; j < s.length(); j++) { tempStr = s.substring(0,j)+addStr+s.substring(j); res_set.add(tempStr); } } return res_set; } /** * 递推实现: * @param str * @return */ public static Set<String> getPermutations(String str) { //当前元素对应的结果, Set<String> res_set = new HashSet<String>(); res_set.add(str.substring(0,1)); if(str.length()==1) { return res_set; } for (int i = 1; i < str.length(); i++) { Set<String> tempSet = new HashSet<String>(); String addStr = str.substring(i,i+1); for (String s : res_set) { //放左边 String tempStr = addStr+s; tempSet.add(tempStr); //放右边 tempStr = s+addStr; tempSet.add(tempStr); //放中间 for (int j = 1; j < s.length(); j++) { tempStr = s.substring(0,j)+addStr+s.substring(j); tempSet.add(tempStr); } } res_set = tempSet; } return res_set; } }
全排列(中)
package 第七章递归知识讲解; import java.util.HashSet; import java.util.Set; /** * 7.8 全排列(中) * @author MZFAITHDREAM * */ public class 递归9 { public static void main(String[] args) { Set<String>res= new 递归9().getPermutations("abcdef".toCharArray(),3); System.out.println(res); } private static Set<String> res = new HashSet();; public static Set<String> getPermutations(char[] charArr,int k) { if(k==charArr.length) { res.add(new String(charArr)); } for (int i = k; i < charArr.length; i++) { swap(charArr,k,i); getPermutations(charArr,k+1);//将剩余元素一次放在k+1位置 swap(charArr,k,i);//还原(回溯) } return res; } static void swap(char[] charArr,int i,int j) { char temp = charArr[i]; charArr[i] = charArr[j]; charArr[j] = temp; } }
全排列(下)
package 第七章递归知识讲解; /** * 7.8 全排列(下) * @author MZFAITHDREAM * */ public class 递归10 { /** * 前缀法 * @param args */ public static void main(String[] args) { permutations("","abc"); } final static int k = 5; static int count = 0; public static void permutations(String prefix,String target) { if(prefix.length() == target.length()) { count++; if(count==k) { System.out.println(prefix); System.exit(0); } } for (int i = 0; i < target.length(); i++) { char ch = target.charAt(i); if(!prefix.contains(ch+"")) { permutations(prefix+ch,target); } } } }