字典序

在数据压缩和数据加密过程中常需要对特殊的字符串进行编码.给定的字母表A由26

个小写英文字母组成A?={a,b,…z}.该字母表产生的升序字符串指的是字符串中字母按

照从左到右出现的次序与字母表中出现的次序相同,且每个字符最多出现1次.例如,

a,b,ab,xyz,ax等都是升序字符串.现在对字母表A产生的所有长度不超过6的升序字符串

按照字典序排列如下.
123…262728…
abc…zabac…
对于给定长度不超过6的升序字符串,编程计算出它在上述字典中的编码.

输入描述
输入数据的第1行是一个正整数k,表示接下来共有k行.在接下来的k行中,每行给出一个

字符串.

输出描述
输出结果,每行对应于一个字符串的编码.

输入样例
3
a
b
abc

输出样例
1
2
352

import java.util.Scanner;
public class charList {//实现:穷举
    static String [] a =new String[] {"0","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
    static int count=1;//长度从1开始
    static String result[];
    static int flag=0;
    static int p;
    public static void main(String[] args){
      Scanner sc= new Scanner(System.in);
      int N=sc.nextInt();
      result=new String[N];
      for(int x = 0;x < N;x++)
       result[x] = sc.next();
       int k = 1;
       for(p = 0;p < N;p++) {
           while (flag != 1) {
               fun("", k, 1, 1, p);//k为几就有几层递归
               k++;
           }
           //还原一次操作
           flag = 0;
           count = 1;
           k = 1;
       }
    }
    private static void fun(String t,int k,int c,int h,int p) {//k最终是result长度,c是内部执行fun次数
                                                       //h为传入的起始判断位置,避免重复出现
    if(k == c)
        check(t,h,p);
    else {
       for(int i = h;i <= 26;i++){
           if(flag != 1)
               fun(t+a[i],k,c+1,i+1,p);//h传入i+1,从下一个字符开始
           else
               break;
       }
     }
    }
    private static void check(String t,int h,int p){
        for(int i = h;i <= 26;i++){
            if((t+a[i]).endsWith(result[p])){
                flag = 1;//匹配成功
                System.out.println(count);
                break;
            }
            count++;
        }
    }
}

传入参数有点多,但是细分一下还是会很清楚的,好久没发博客了,一段时间没写代码,手生。。。。曾经说好的练手呢?最后是参考了大佬的想法做出来的,希望这种做法能帮到有疑惑的小伙伴。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值