问题是要求我返回包含由" cc"组成的所有字符串组合的集合。和" ddd"给定长度n。
因此,例如,如果给定的长度为5,则设置将包括" ccddd"和" dddcc"。 和长度6将返回包含" cccccc"," dddddd"的集合 和长度7将返回set contating" ccdddcc"," dddcccc"," ccccddd" 和长度12将返回12种不同的组合,依此类推
但是,返回的设置为空。 你能帮忙吗?
"请理解极端糟糕的编码风格"
public static Set<String> set = new HashSet<String>();
public static Set<String> generateset(int n) {
String s = strings(n,n,"");
return set; // change this
}
public static String strings(int n,int size, String s){
if(n == 3){
s = s + ("cc");
return "";}
if(n == 2){
s = s + ("ddd");
return "";}
if(s.length() == size)
set.add(s);
return strings(n-3,size,s) + strings(n-2,size,s);
}
答案 0 :(得分:0)
我认为您需要重新考虑您的方法。这不是一个容易出问题的问题,所以如果您对Java非常陌生(并且对其他编程语言并不十分熟悉),在解决某些问题之前,您可能希望尝试一些涉及集合,列表或其他集合的更简单的问题。像这样。
假设你想要尝试它:这样的递归问题需要非常清楚地思考你想要如何完成任务。我认为你有一个大致的想法,但它需要更加清晰。以下是我如何处理这个问题:
(1)你想要一个返回长度为N的字符串的列表(或集合)的方法。你的递归方法返回一个String
,据我所知,你没有明确定义结果字符串是什么。 (清晰的定义在编程中非常重要,但在解决复杂的递归问题时可能更是如此。)
(2)字符串将以"cc"
或"ddd"
开头。因此,要形成结果列表,您需要:
(2a)查找长度为N-2的所有字符串。这是您需要递归调用以获取该长度的所有字符串的位置。浏览该列表中的所有字符串,并将"cc"
添加到每个字符串的前面。
(2b)同样,通过递归调用找到长度为N-3的所有字符串;浏览该列表中的所有字符串,并将"ddd"
添加到前面。
(2c)结果列表将是步骤(2a)和(2b)中的所有字符串。
(3)你需要基础案例。如果N为0或1,则结果列表为空。如果N == 2,它只有一个字符串"cc"
;如果N == 3,它将只有一个字符串"ddd"
。
如果您愿意,可以使用Set
代替列表,因为订单无关紧要。
请注意,使用全局列表或设置保存结果不是一个好主意。当一个方法以递归方式调用自身,并且该方法的每次调用都触及相同的列表或集合时,您将疯狂地尝试使一切工作。如果让每个递归调用都保留其自己的本地列表和结果,那就容易多了。 编辑:这需要澄清。使用全局(即所有递归调用共享的实例字段)集合来保存 final 结果是可以的。但我上面概述的方法涉及很多中间结果 - 即。如果你想找到长度为8的所有字符串,你也会找到长度为6,5,4 ......的字符串;使用全局来容纳所有这些将是痛苦的。
答案 1 :(得分:0)
为什么set is returned empty
的答案只是遵循逻辑。假设您执行generateset(5);
将执行strings(5,5,"");
:
第一次迭代strings(5,5,"");
:(s.length() == size)
为false,因此set
中没有添加任何内容
第二次迭代strings(2,5,"");
:(n == 2)
为真,因此set
中没有添加任何内容
第三次迭代strings(3,5,"");
:(n == 3)
为真,因此没有添加任何内容
至set
所以设置保持不变。