给出一个字符串S和一个整数k,您需要仅使用字符串S中存在的字符来查找并返回所有可能由大小k组成的字符串。 字符可以根据需要重复多次。
example.com
这里我遇到堆栈溢出错误@
import java.util.*;
public class Solution {
public static String[] allStrings(String charSet, int len) {
// Write your code here
HashMap<Character,Boolean> map=new HashMap<>();
for (int i=0; i<charSet.length();i++){
if(!map.containsKey(charSet.charAt(i))){
map.put(charSet.charAt(i),true);
}
}
ArrayList<Character> al=new ArrayList<Character>();
for (Map.Entry<Character,Boolean> entry:map.entrySet()){
al.add(entry.getKey());
}
ArrayList<String> real=new ArrayList<String>();
String pre="";
perm(pre,al,len,real);
String []a=new String[real.size()];
a=real.toArray(a);
return a;
}
public static void perm(String pre,ArrayList<Character> al,int k,ArrayList<String> real) {
if(k==0){
real.add(pre);
return;
}
for(int i=0;i<al.size();i++){
pre=pre+al.get(i);
perm(pre,al,--k,real);
}
}
}
答案 0 :(得分:0)
您在这里有两个问题:
pre=pre+al.get(i);
perm(pre,al,--k,real);
您进行此递归调用al.size()
次,每次递减k
。由于k
已初始化为所需String
的长度,因此,如果k < al.size()
最终将变为负数,并且递归调用将永远不会终止(因为它仅在{{1 }}。
在每次递归调用之前,您都向k==0
添加了一个字符,但是没有删除在上一次迭代中添加的字符。因此,最终输出pre
比所需长度长。
您可以按以下步骤解决问题,但保持String
和pre
不变:
k