I'm trying to find the rank of given strings using recursion

afraah :

I'm trying to find the rank of given strings using recursion, but can't seem to to come out of the recursion the way I want to. Where am I going wrong?

    class Solution {
    public static int flag=0;
    public static int ans=0;
    public static int findRank(String A) {
      /* write your solution here */
      char[] carr=A.toCharArray();
      Arrays.sort(carr);
      String suffix=new String(carr);
      ArrayList<String> list=new ArrayList<String>();
          int rank=0;
      rank=generate(rank,"",suffix,list,A);

      for(int i=0;i<list.size();i++)
        System.out.print(list.get(i)+" ");

       return rank;
     }

    public static int generate(int rank,String prefix,String suffix, ArrayList<String> list,String A){
        if(suffix.length()==0){
            list.add(prefix);
            rank++; 
            if(prefix.equals(A)){

                return rank;
            }
        }

        for(int i=0;i<suffix.length();i++) {
          //  System.out.println(rank);
          return generate(rank,prefix+suffix.charAt(i),suffix.substring(0,i)+suffix.substring(i+1),list, A); 
        }

        return rank;
    }
}

This is the question: Given a string, find the rank of the string amongst its permutations sorted lexicographically. Assume that no characters are repeated.

Example :

Input : 'acb' Output : 2 The order permutations with letters ‘a’, ‘c’, and ‘b’ :

abc acb bac bca cab cba

I tried putting it in a visualizer, here's the code for that:

    import java.util.*;
public class Solution {
    public static int flag=0;
    public static int ans=0;
  public static void main(String args[]) {
      /* write your solution here */
     String A="dbca";
      char[] carr=A.toCharArray();
      Arrays.sort(carr);
      String suffix=new String(carr);
      ArrayList<String> list=new ArrayList<String>();
          int rank=0;
      rank=generate(rank,"",suffix,list,A);

      for(int i=0;i<list.size();i++)
        System.out.print(list.get(i)+" ");

       System.out.println(rank);

  }

    public static int generate(int rank,String prefix,String suffix, ArrayList<String> list,String A){
        if(suffix.length()==0){
            list.add(prefix);
            rank++;
            if(prefix.equals(A)){

                return rank;
            }

        }

            for(int i=0;i<suffix.length();i++){
              //  System.out.println(rank);
                   return generate(rank,prefix+suffix.charAt(i),suffix.substring(0,i)+suffix.substring(i+1),list, A);

            }

        return rank;
    }
}

https://cscircles.cemc.uwaterloo.ca/java_visualize/#mode=edit

Eran :

Your for loop causes you to end the recursion after you find the first permutation, which is why you always return 1.

What you should be doing is to end the recursion once you find the permutation you are looking for. You can do that, for example, if your recursive method would return a boolean flag instead of an int.

Once the recursive method returns, the length of your list will be the rank you are looking for:

public static int findRank(String A) 
{
    char[] carr=A.toCharArray();
    Arrays.sort(carr);
    String suffix=new String(carr);
    ArrayList<String> list=new ArrayList<String>();
    generate("",suffix,list,A);
    for(int i=0;i<list.size();i++)
        System.out.print(list.get(i)+" ");

     return list.size();
}

public static boolean generate(String prefix,String suffix, ArrayList<String> list,String A)
{
    if(suffix.length()==0){
        list.add(prefix);
        return (prefix.equals(A));
    }

    for(int i=0;i<suffix.length();i++) {
        if (generate(prefix+suffix.charAt(i),suffix.substring(0,i)+suffix.substring(i+1),list, A)) {
            return true;
        }
    }

    return false;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=353116&siteId=1