Java 递归函数中有循环的函数的复杂性是什么

Java 递归函数中有循环的函数的复杂性是什么,java,algorithm,loops,recursion,Java,Algorithm,Loops,Recursion,我试图分析这段代码的复杂性。 我断定它是o(n^2) 因为for循环在递归函数中取o(n),递归函数取o(n) o(n)*o(n)=o(n^2) 但是我不确定 public class main { static Set<String> setString = new HashSet<>(); public static void main(String[] args) { // TODO Auto-generated me

我试图分析这段代码的复杂性。 我断定它是o(n^2) 因为for循环在递归函数中取o(n),递归函数取o(n) o(n)*o(n)=o(n^2) 但是我不确定

public class main 
{

    static Set<String> setString = new HashSet<>();

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        main m = new main();
        m.permute("sanad", 0);
        for(String s : setString)
        {
            System.out.println(s);
        }

    }


    public void permute(String str , int i )
    {
        if (i>=str.length())
        {
            return;
        }


        for(int j = 0 ; j < str.length();j++)
        {
            StringBuilder b = new StringBuilder(str. replaceFirst(String.valueOf(str.charAt(i)), ""));
            b.insert(j,str.charAt(i));
            setString.add(b.toString());
        }

        permute(str, ++i);
    }

}
公共类主
{
static Set setString=new HashSet();
公共静态void main(字符串[]args)
{
//TODO自动生成的方法存根
main m=新的main();
m、 排列(“sanad”,0);
用于(字符串s:setString)
{
系统输出打印项次;
}
}
公共void排列(字符串str,int i)
{
如果(i>=str.length())
{
返回;
}
对于(int j=0;j
总复杂度是嵌套复杂度的乘积,并且排列函数被调用n次,其中n是字符串的长度,循环也被调用n次,导致循环调用n^2次,这是正确的。但是,您还必须查看循环中代码的复杂性,特别是
replaceFirst
insert
,确定它们的运行时间是否取决于字符串的长度,并与之相乘。由于我怀疑这是一个家庭作业问题,我将此问题留给您。

您是否试图将字符串的所有排列放入哈希集中?是否保证该字符串只包含唯一字符?如果不是,则说明您的程序不正确。@realpoint unique string,因为我使用的是set。@JaysonBoubin是。但是我想在o(n)上解决这个问题,不。。。如果一个程序必须创建N!解决方案,那么就是O(N!)。它必须至少在某个地方写一次每个解决方案…谢谢。。。不,这不是家庭作业,我需要做的是用o(n)复杂度来解决这个问题