【问题标题】:I'm trying to find the rank of given strings using recursion我正在尝试使用递归查找给定字符串的等级
【发布时间】:2020-07-04 16:49:03
【问题描述】:

我正在尝试使用递归查找给定字符串的等级,但似乎无法以我想要的方式退出递归。我哪里错了?

    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;
    }
}

这是一个问题: 给定一个字符串,找出该字符串在其按字典顺序排序的排列中的排名。 假设没有字符重复。

例子:

输入:'acb' 输出:2 字母“a”、“c”和“b”的顺序排列:

abc ab 背书 bca 出租车 cba

我试着把它放在可视化器中,下面是它的代码:

    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

【问题讨论】:

  • “排名”是什么意思
  • 在“abc acb bac bca cab cba”系列中,“acb”的排名为2。
  • 嗯,好的。为什么?
  • @Stultuske 这在问题中得到了我满意的解释,并得到了一个例子的支持:排列字符串。对排列进行排序。确定原始字符串的索引(1-开始)。
  • afraah,请应用一致的缩进。

标签: java string recursion permutation


【解决方案1】:

您的 for 循环会导致您在找到第一个排列后结束递归,这就是为什么您总是返回 1。

您应该做的是在找到您正在寻找的排列后结束递归。您可以这样做,例如,如果您的递归方法将返回 boolean 标志而不是 int

一旦递归方法返回,list 的长度将是您要查找的排名:

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;
}

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2014-05-16
    • 2020-09-08
    • 2012-11-28
    • 2016-10-02
    • 2021-01-30
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多