字符串的全部子序列(递归)

简介: 在计算机科学中,子序列和子串的概念非常重要,这两个概念经常在数据处理,文本分析,编程算法等领域被广泛使用。理解子序列和子串的区别以及如何高效地处理它们对于成为一名有效的程序员是非常重要的。

      在计算机科学中,子序列和子串的概念非常重要,这两个概念经常在数据处理,文本分析,编程算法等领域被广泛使用。


      首先,让我们定义子序列和子串的概念。子串是原始字符串的一个连续的部分,而子序列则可以不连续。例如,对于字符串abc,它的子串包括abcabbcabc和空串,总共7个。另一方面,它的子序列包括这些子串以及ac,总共8个。


      由于子串是连续的,我们可以通过简单的数学公式计算出给定字符串的子串数量:n(n+1)/2+1。这里,n是字符串的长度。所以对于字符串abc,我们有3*(3+1)/2 + 1 = 7个子串。


      计算给定字符串的子序列数量:2^n。这是因为,对于字符串中的每个字符,我们可以选择包含它或不包含它在子序列中。因此,对于每个字符,我们有两种选择,所以总的选择数量是2^n。例如,对于字符串abc,我们有2^3 = 8个子序列。


打印一个字符串的全部子序列, 包括空字符串


输入:


abc


输出:


   // 第一个是空串

c

b

bc

a

ac

ab

abc


importjava.io.BufferedInputStream;
importjava.util.Scanner;
publicclasstest {
publicstaticvoidprintAllSub(char[] str, inti, Stringres) {
if (i==str.length) {
System.out.println(res);
return ;
        } else {
printAllSub(str, i+1, res); // 不要下标为i+1的字符printAllSub(str, i+1, res+str[i]); // 要第i+1个字符        }
    }
publicstaticvoidmain(String[] args) {
Scannercin=newScanner(newBufferedInputStream(System.in));
Stringstr=cin.next();
printAllSub(str.toCharArray(), 0, "");
cin.close();
    }
}


image.gif

================Talk is cheap, show me the code================

目录
相关文章
|
2天前
|
人工智能 算法 测试技术
【动态规划】【字符串】【C++算法】940. 不同的子序列 II
【动态规划】【字符串】【C++算法】940. 不同的子序列 II
|
2天前
392.判断子序列
392.判断子序列
10 0
|
2天前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
32 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
2天前
|
人工智能 算法 BI
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
|
2天前
|
人工智能 算法 Java
判断子序列
判断子序列
18 0
|
2天前
|
存储 编译器 C语言
Day2 排序子序列、倒置字符串
Day2 排序子序列、倒置字符串
29 0
|
9月前
字符串的全排列
字符串的全排列
50 0
|
10月前
|
算法 搜索推荐
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
【算法】非递归堆排序判断字符串中所有字符是否只出现一次
35 0
|
10月前
leecode 115 不同的子序列 对子串包含问题的思考与理解
leecode 115 不同的子序列 对子串包含问题的思考与理解
58 1
|
11月前
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
90 0