2021/3/20算法题打卡-不同子串

不同子串

题目

不同子串
本题总分:5 分
【问题描述】
一个字符串的非空子序列是指字符串中长度至少为 1 的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子序列?

分析

子序列比较难求,我们可以先求出所有的1位、2位到所以位的情况,然后判断是否重复(使用Set自动去重),使用递归求所以情况,递归传入总位数,和现在要得到的字符下标,后面的字符必须全部在此下标之后,将得到的字符传入一个全局变量StringBuffer中,递归回退的时候,删掉

代码

package com.blueBrageCup.B2019;

import java.util.HashSet;
import java.util.Set;

/**
 * @auther thk
 * @date 2021/3/23 - 8:56
 */
public class T2不同子串 {

    static String s = "0100110001010001";
    static Set<String> set = new HashSet<>();

    static StringBuffer str = new StringBuffer();

    private static void f(int k,int f) {
        char c = s.charAt(f);
        str.append(c);
        if(k==str.length()){
            set.add(str.toString());
            str.deleteCharAt(str.length()-1);
            return;
        }
        for(int i=f+1;i<16;i++){
            f(k,i);
        }
    }

    public static void main(String[] args) {
        for(int i=1;i<=s.length();i++){
            for(int f=0;f<16;f++){
                f(i,f);
                str.delete(0,str.length());
            }
            str.delete(0,str.length());
        }

        System.out.println(set.size());
    }

}

posted @ 2021-03-23 10:27  唐坣  阅读(92)  评论(0)    收藏  举报