从给定的字符串中打印所有可能的长度为k的字符串,并允许使用usibg arraylist进行替换

给出一个字符串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,--k,real);
        }
    }
}
mmtsky 回答:从给定的字符串中打印所有可能的长度为k的字符串,并允许使用usibg arraylist进行替换

您在这里有两个问题:

pre=pre+al.get(i);
perm(pre,al,--k,real);
  1. 您进行此递归调用al.size()次,每次递减k。由于k已初始化为所需String的长度,因此,如果k < al.size()最终将变为负数,并且递归调用将永远不会终止(因为它仅在{{1 }}。

  2. 在每次递归调用之前,您都向k==0添加了一个字符,但是没有删除在上一次迭代中添加的字符。因此,最终输出pre比所需长度长。

您可以按以下步骤解决问题,但保持Stringpre不变:

k
本文链接:https://www.f2er.com/3161132.html

大家都在问