【问题标题】:Infinite Recursion for finding the subsets of a string?无限递归查找字符串的子集?
【发布时间】:2016-06-07 17:48:15
【问题描述】:

我正在尝试查找给定字符串的所有子集。例如,字符串“Rum”将具有子集“rum”、“ru”、“rm”、“r”、“um”、“u”、“m”和“”。 到目前为止,这是我的代码:

import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
public class SubsetGenerator
{
    private String word;

    public SubsetGenerator(String in)
    {
        word=in;
    }
    public ArrayList<String> findSubsets()
    {
        ArrayList<String> subsets = new ArrayList<String>();
        String temp = word;
        if(temp.length()==1)
        {
            subsets.add(temp);
            return subsets;
        }
        else
        {
            String removed = temp.substring(0,1);
            temp = temp.substring(1);
            findSubsets();
            subsets.add(word);
        }
        return subsets;
    }

}

这是测试人员:

import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
/**
 This program tests the subset generator.
*/
public class SubsetGeneratorTester
{
 public static void main(String[] args)
 {
 SubsetGenerator generator = new SubsetGenerator("rum");

 List<String> subsets = generator.findSubsets();
 // Sort the result for checking
 Collections.sort(subsets);
 System.out.println(subsets);
 System.out.println("Expected: [, m, r, rm, ru, rum, u, um]");
 }
}

【问题讨论】:

  • 你现在得到了什么?
  • @ifly6 在 SubsetGenerator.findSubsets(SubsetGenerator.java:26) 的 java.lang.String.substring(String.java:1969) 的线程“main”java.lang.StackOverflowError 中出现无限递归异常在 SubsetGenerator.findSubsets(SubsetGenerator.java:26) 在 SubsetGenerator.findSubsets(SubsetGenerator.java:26) 在 SubsetGenerator.findSubsets(SubsetGenerator.java:26) 在 SubsetGenerator.findSubsets(SubsetGenerator.java:26) 在 SubsetGenerator.findSubsets(SubsetGenerator .java:26) 在 SubsetGenerator.findSubsets(SubsetGenerator.java:26
  • 您应该查看StackOverflowError 上的 SO 答案。
  • 你试过跟踪你的递归方法吗?
  • 我认为并不是真正的递归问题。

标签: java loops recursion infinite


【解决方案1】:

你的方法有点混乱。我建议你使用类似这样的算法:

public class SubsetGenerator {  
    private String word;
    private ArrayList<String> list;

    public SubsetGenerator(String word) {
        //constructor and initialize variables
    }

    void findSubsets(String str) {
         list.add(str)

         for(int i = 0 ; i < str.length() ; i++) {
             String substring = /*str with char at index i removed*/
             this.findSubsets(substring);
         }
    }
}

这应该包括所有变体。希望对您有所帮助。

【讨论】:

  • 从字符串中间删除一个字符不会创建一个有效的子字符串。
  • @nbrooks 为什么不呢?在他的问题中,“rm”是“rum”的有效子字符串
  • 你说得对,我没有意识到 OP 的例子包括了这一点。我想这可能是他们将其称为“子集”而不是“子字符串”的原因,因为根据定义,substring 是一个出现在另一个字符串中的字符串。所以从技术上讲,这个算法产生的不是子字符串,而是subsequence。似乎是OP想要的!
【解决方案2】:

我已经写了一个递归回溯解决方案:

import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
public class SubsetGenerator
{
    private String word;
    private ArrayList<String> temp;

    public SubsetGenerator(String in)
    {
        word=in;
        temp = new ArrayList<String>();
    }
    public void solve(int idx, String s){
        if(idx == word.length()){
            temp.add(s);
            return;
        }
        solve(idx+1, s + word.charAt(idx));
        solve(idx+1, s);
    }
    public ArrayList<String> findSubsets(){
        solve(0, "");
        return temp;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2021-11-29
    • 1970-01-01
    • 2021-07-27
    • 2016-10-02
    • 2016-05-20
    • 2019-03-29
    • 2021-12-10
    相关资源
    最近更新 更多