题目描述
在数据压缩和数据加密过程中常需要对特殊的字符串进行编码.给定的字母表A由26
个小写英文字母组成A?={a,b,...z}.该字母表产生的升序字符串指的是字符串中字母按
照从左到右出现的次序与字母表中出现的次序相同,且每个字符最多出现1次.例如,
a,b,ab,xyz,ax等都是升序字符串.现在对字母表A产生的所有长度不超过6的升序字符串
按照字典序排列如下.
123…262728…
abc…zabac…
对于给定长度不超过6的升序字符串,编程计算出它在上述字典中的编码.
输入描述
输入数据的第1行是一个正整数k,表示接下来共有k行.在接下来的k行中,每行给出一个
字符串.
输出描述
输出结果,每行对应于一个字符串的编码.
解题思路:
穷举。
package practice;
import java.util.Scanner;
public class N39Dic {
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 flag=0;
static String result;
static int count=1;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
result = sc.next();
int k=1;
while(flag!=1){
fun("",k,1,1);
k++;
}
}
private static void fun(String te, int k, int c,int h) {
if(k==c){
Cal(te,h);
}else{
for(int i=h;i<=26;i++){
if(flag!=1){
fun(te+a[i],k,c+1,i+1);
}else{
break;
}
}
}
}
private static void Cal(String te,int h) {
for(int i=h;i<=26;i++){
if((te+a[i]).endsWith(result)){
flag=1;
System.out.println(count);
break;
}
count++;
}
}
}