暴力递归练习(一)— 打印一个字符串的全部子序列

题目:
假设字符串String str = “abc”,那么它的子序列有" "、a、b、c、ab、ac、bc、abc。依次从头往后拿,所有情况都枚举即可。

思路:总结起来一句话,就是在遍历中的每层是“要”还是“不要”,并进行记录

  1. 因为要获取字符串的所有子序列,那么将传进来的字符串转换成char[],并且这个char[]是固定不变的。
  2. 用变量index用来表示当前数组下标,表示当前在数组中的位置。
  3. 用变量path来记录数组所有走过的位置是否保留的路径结果,比如说:String s = “abc”,此时index = 0,初始刚进来时,path = “”,此时index = 1,那如果上一层的"a"要是保留,则path = “a”,如果“a”不保留,则path = “”。
  4. base case:当index = arr.length时,数组已经到头,此时将每一步的结果都进行保存,全部子序列即可获得。

代码
因为每一层都也能要,也可能不要,那如果要,则path拼接当前index下的字符,继续向下传递,如果不要,则依然是path本身。等到index = arr.length,数组没有下一个时,此时的path已经是所有之前数组中每一个位置取舍的结果,将path添加到list中即可。

 public static List<String> subs(String s) {
    
    
        char[] charArr = s.toCharArray();
        List<String> ans = new ArrayList<>();
        String path = "";
        //从数组位置0开始,初始时path = “”,将结果每一步的结果保存到path中
        process(charArr, 0, ans, path);
        return ans;
    }

    public static void process(char[] arr, int index, List<String> ans, String path) {
    
    
    	//base case:数组到头,将之前的结果path,添加到list中
        if (index == arr.length) {
    
    
            ans.add(path);
            return;
        }
        //如果当前数组index位置 不保留,则依然是path本身
        String no = path;
        process(arr, index + 1, ans, no);
		
		//如果当前数组index位置 保留,则拼接之前的path结果
        String yes = path + String.valueOf(arr[index]);
        process(arr, index + 1, ans, yes);
    }

如果要是在此基础上,要求去除重复的字符串呢?
也很简单,将path添加到Set中,然后遍历Set到List中即可。

代码

 public static List<String> subs(String s) {
    
    
        char[] charArr = s.toCharArray();
        List<String> ans = new ArrayList<>();
        HashSet<String> strSet = new HashSet<>;
        String path = "";
        //从数组位置0开始,初始时path = “”,将结果每一步的结果保存到path中
        process(charArr, 0, ans, path);
        for(String str : strSet){
    
    
        	ans.add(str);
        }
        return ans;
    }

    public static void process(char[] arr, int index, HashSet<String> strSet, String path) {
    
    
    	//base case:数组到头,将之前的结果path,添加到list中
        if (index == arr.length) {
    
    
            strSet.add(path);
            return;
        }
        //如果当前数组index位置 不保留,则依然是path本身
        String no = path;
        process(arr, index + 1, ans, no);
		
		//如果当前数组index位置 保留,则拼接之前的path结果
        String yes = path + String.valueOf(arr[index]);
        process(arr, index + 1, ans, yes);
    }

猜你喜欢

转载自blog.csdn.net/weixin_43936962/article/details/132456920