4

我应该首先说这里提出了类似的问题,但是对于我正在进行的作业,我不能使用任何循环,并且这些问题的所有答案都使用循环。所以使用 java 6 和递归来生成给定字符串的所有子字符串。例如,您给定的 String word = "Ralph"; 我需要像这样格式化输出。

Ralph
Ralp
Ral
Ra
R
alph
alp
al
a
lph
lp
l
ph
h

这是我的生成方法

    //written by Justin Tew<BR>

public static void generate(String word) 
{


    //base case... wtf is the base case here?
    //idk bout this 
    if (word.length() == 1)
    {
        System.out.println(word);
        return;
    }


    //recursive case
    if (word.length() != 0)
    {

        System.out.println(word);
        generate(word.substring(0, word.length()-1)); //gets the first 5 substrings
    }

输出:

Ralph
Ralp
Ral
ra
r

在我看来,这个电话generate(word.substring(1, word.length()-1));应该得到下一个 5 但它不会得到非常奇怪的输出......

有任何想法吗?

4

6 回答 6

2

两个答案都非常正确。我刚刚添加了一个名为的新方法suffixGen

public static void suffixGen(String word)
{
    if (word.length() > 1)
    {
        generate(word);
        suffixGen(word.substring(1));
    }

}

在我的主要工作中,我只是打电话suffixGen而不是generate它让我得到了想要的结果。

于 2012-11-03T16:47:45.240 回答
1

您可以递归单词长度,而不是递归单词的字母。例如,在递归的顶层,您可以找到所有带有word.length()字母的子字符串,然后是word.length() - 1字母等等。不过,这可能需要两种递归方法,一种遍历单词长度,另一种遍历该长度的所有可能子字符串。

于 2012-11-02T15:06:22.263 回答
1

听起来你已经完成了大部分工作。只需编写另一个递归generateSuffix(word)方法

  • 第一次打电话generate(word)
  • generateSuffix()然后用最长的单词后缀调用。

您仍然需要与您在生成中所拥有的基本案例类似的基本案例。

于 2012-11-02T15:10:44.847 回答
0

您不需要辅助方法,如果您将附加字符串传递给该方法,只需将其值作为空白传递,如下面的方法调用所示:

    public static void substrings(String str, String temp)
    {
        if(str.length()==0)
        {
            System.out.println(temp); return;
        }

          substrings(str.substring(1), temp+str.substring(0,1));
          substrings(str.substring(1), temp);
    }

示例调用 ---> substrings("abc", "") ;

产生以下输出:

美国广播公司

抗体

交流

一个

公元前

b

C

有一个不可见的字符串实际上是一个空白字符串。

于 2014-07-05T06:27:42.613 回答
0

一个易于阅读的解决方案在这里

public class AllSubStrings {
    //hashset to keep a record of all the substrings
    static HashSet<String> subStrings_r=new HashSet<>();

    public static void main(String[] args) {
        String testString="Sujal";
        getSubstrings_r(testString);
        System.out.println("RECURSION ->"+subStrings_r);
    }

    public static void getSubstrings_r(String testString){
        _getSubstrings_r(testString, 0, testString.length());
    }

    public static void _getSubstrings_r(String testString,int start,int end){
        if(start==end){ //base condition
            return;
        }
        subStrings_r.add(testString.substring(start, end));
        //start getting substrings from left to right
        _getSubstrings_r(testString,start+1,end); 
        //start getting substrings from right to left
        _getSubstrings_r(testString,start,end-1);
    }

}
于 2017-09-12T02:47:15.953 回答
0

尝试这样的事情

String word; 
int word_length = word.length(); //get the length of the word

for(int i=0;i<word_length;i++){
   for(int j=0; j<=word_length-i ; j++){

       String sub = word.substring(i,i+j); 
       System.out.println(sub); //print the substrings
    }
于 2015-07-18T01:58:46.370 回答