当前位置: 首页 > 知识库问答 >
问题:

使用递归(void方法)打印子字符串

屠盛
2023-03-14

我想按以下顺序打印子字符串:-“”,“D”,“C”,“CD”,“B”,“BD”,“BC”,“BCD”,“A”,“AD”,“AC”,“ACD”,“AB”,“ABD”,“ABC”,“ABCD”

import java.util.Scanner;

public class PrintSubstringsWithVoid {
    public static void main(String[] args) {
        Scanner scn =new Scanner(System.in);
        String str=scn.nextLine();
        printSub(str,'\0');
    }
    public static void printSub(String str,char ch1){

        if (str.length()==0){
            StringBuilder sb=new StringBuilder();
            sb.append(ch1);
            System.out.println(sb.toString()+"");
            return;
        }
        char ch=str.charAt(0);
        String st=str.substring(1);
        printSub(st,ch1);
        StringBuilder sb1=new StringBuilder();
        if (st.length()<=1){
            sb1.append(ch);
            StringBuilder sb2=new StringBuilder();
            sb2.append(ch1);
            String stt=sb2.toString()+sb1.toString();
            System.out.println(stt);

            String st1=sb2.toString()+sb1.toString()+st;
            if (st.length()!=0) {
                System.out.println(st1);
            }
        }else{

            printSub(st,ch);
        }

    }
}

在这里,最后4个阵型的“a”不见了

共有1个答案

钱星华
2023-03-14

解决方案很简单,就像你有一个字符串“abcd”。所以如果你知道“bcd”的答案,那么“abcd”的答案将是“bcd”的答案加上字符串,方法是用“bcd”的所有结果加上“a”。

例如,“bcd”的结果是:d,c,cd,b,bd,bc,bcd,
因此“ABCD”的结果将是:d,c,cd,b,bd,bc,bcd,a,a+(d,c,cd,b,bd,bc,bcd)

所以解决方案是:

import java.util.ArrayList;
import java.util.Scanner;

public class PrintSubstrings {

    public static void main(String[] args) {
        Scanner scn =new Scanner(System.in);
        String str=scn.nextLine();
        ArrayList<String>ans=printSub(str);
        for(int i=0;i<ans.size();i++)
        {
            System.out.print(ans.get(i)+" ");
        }
    }
    public static ArrayList<String> printSub(String str) {

        if(str.length()==0)return new ArrayList<String>();

        ArrayList<String> fx=printSub(str.substring(1));

        int size=fx.size();
        fx.add(Character.toString(str.charAt(0)));
        for(int i=0;i<size;i++)
        {
            fx.add(str.charAt(0)+fx.get(i));
        }
        return fx;
    }
}

使用void函数:

import java.util.ArrayList;
import java.util.Scanner;

public class aa {

    public static void main(String[] args) {
        Scanner scn =new Scanner(System.in);
        String str=scn.nextLine();
       printSub(str,"");

    }
    public static void  printSub(String str,String pre) {

        if(str.length()==0){
           System.out.println(pre);
          return;
        }

         printSub(str.substring(1),pre);

         printSub(str.substring(1),pre+Character.toString(str.charAt(0)));

    }
}
 类似资料:
  • 我正在编写一段代码,用于递归地只打印字符串的字典序较大的子字符串。 代码运行良好。我在这里所做的是递归生成所有子字符串,并同时将它们插入ArrayList。后来对该列表进行排序,比较字符串,瞧,就这样完成了。 现在困扰我的是这个程序的复杂性。在这里,我生成所有的子字符串,然后从中进行选择。对于递归,我觉得这是一个自动化的过程,所有的子字符串都必须至少创建或访问一次。所以,在这一点上,我想问一下这是

  • 我试图编写一个方法,使用递归打印字符串的所有排列。现在,我有这样的代码: 它打印出正确的结果,但我试图在不使用循环的情况下解决它,包括第4行中的循环。可能吗?如果是这样,你会如何解决?非常感谢。 我试图添加第三个名为index的参数,并在第5行的递归调用中写入index 1,但没有成功。我认为添加第三个参数是个好主意,我只是不知道如何使用它。

  • 12.3. Display,一个递归的值打印器 接下来,让我们看看如何改善聚合数据类型的显示。我们并不想完全克隆一个fmt.Sprint函数,我们只是构建一个用于调试用的Display函数:给定任意一个复杂类型 x,打印这个值对应的完整结构,同时标记每个元素的发现路径。让我们从一个例子开始。 e, _ := eval.Parse("sqrt(A / pi)") Display("e", e) 在

  • 家庭作业:寻找更好的策略或方法,而不是完整的代码。 当我试图确定这个问题的递归情况时,我完全被弄糊涂了。我必须编写一个接受整数参数“n”的方法,然后输出总共“n”个字符。根据原始整数是奇数还是偶数,中间字符应始终为“”或“*”。下面是两个不同的方法调用和输出应该是什么样子: 我该如何识别递归案例呢?

  • 我试图以相反的顺序打印一个链表,但实际上没有使用递归进行反转,但我的输出结果非常奇怪。看起来我的代码基本上选择了第一个节点,并在打印完链表的其余部分(按原始顺序)后将其打印出来。我所写的代码(据我所知)是正确的,并且与internet上解决此问题的代码相匹配。 这是我的代码: 以下是节点类: 这是我给出的输入,然后是输出: 这里发生的另一个奇怪的事情是,如果我改变递归的条件,假设我这样做: 然后是

  • 我在Hackerrank上解决反向挑战的指纹 方法接受一个参数-链表的头部。您不应该从stdin/console中读取任何输入。头部可能是空的,所以不应该打印任何东西。按照与stdout/console相反的顺序打印链表的元素(使用printf或cout),每行一个。 NB:节点的结构为struct Node{int data;struct Node*next;}