zoukankan      html  css  js  c++  java
  • 排列序数

    /* 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
    
      abcd  0
    
      abdc  1
    
      acbd  2
    
      acdb  3
    
      adbc  4
    
      adcb  5
    
      bacd  6
    
      badc  7
    
      bcad  8
    
      bcda  9
    
      bdac 10
    
      bdca 11
    
      cabd 12
    
      cadb 13
    
      cbad 14
    
      cbda 15
    
      cdab 16
    
      cdba 17
    
      ...
    
        现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
    
    【输入格式】
    
    一行,一个串。
    
    【输出格式】
    
    一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
    
    例如:
    
    输入:
    
    bdca
    
    程序应该输出:
    
    11
    
    再例如:
    
    输入:
    
    cedab
    
    程序应该输出:
    
    70
    
    资源约定:
    
    峰值内存消耗(含虚拟机) < 256M
    
    CPU消耗 < 1000ms
    
    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
    
    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    
    注意:主类的名字必须是:Main,否则按无效代码处理。*/
    package test;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class 排列序数{
        static String str;
        static char[] arr,target;
        static int count;
        public static void main(String[] args){
            Scanner sca = new Scanner(System.in);
            str = sca.nextLine();
            arr = str.toCharArray();
            Arrays.sort(arr);//将输入的字符串按大小排序后存入数组
            boolean[] vis = new boolean[20];//标记该字母是否使用
            target = new char[arr.length];//存放变化的数组
            dfs(0,vis);
        }
    
        private static void dfs(int step, boolean[] vis) {
            if(step == target.length){
                if(str.equals(String.valueOf(target))){//如果遍历到相同字符串,输出当前的序号
                    System.out.println(count);
                }
                ++count;//不相同则序号加1,并返回
                return ;
            }
            
            for(int i = 0; i < target.length; ++i){
                if(!vis[i]){
                    vis[i] = true;
                    target[step] = arr[i];//当前step的变化数组存放第i个字母
                    dfs(step+1,vis);
                    vis[i] = false;//回溯
                }
            }
        }
    }
  • 相关阅读:
    两个泛型实例之间的属性变化
    C#
    字符编码
    如何在阿里云 CentOS 8 / RHEL 8 上安装 vsftpd(ftp 服务器)
    使用 ASP.NET Core 创建 Web API使用 JavaScript 调用报错 webapi Unable to get items. TypeError: Failed to fetch
    让WPF程序启动时以管理员身份运行(转载)
    WPF任务栏同步进度
    C# ref and out
    C# 中 string.Empty、""、null的差别
    如何读写拥有命名空间xmlns 属性的Xml文件(C#实现)
  • 原文地址:https://www.cnblogs.com/ljs-666/p/8595646.html
Copyright © 2011-2022 走看看