字典排序问题-算法设计与分析--java

本文介绍了一种针对升序字符串的编码算法实现,该算法能够计算特定字符串在字典中的编码位置。通过递归方式计算不同长度的升序字符串数量,并结合字符串特征完成最终编码。

题目描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表中产生的所有长度不超过6的升序字符串,计算它在字典中的编码。
在这里插入图片描述

package 算法设计与分析;

import java.util.Scanner;

public class K1_5 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入要查找的字符串");
		while (true){
			String S = in.nextLine();
			System.out.println("字符串对应位置");
			System.out.println(Count(S));
			System.out.println("请输入要查找的字符串数");
		}
		
	}
	
	//计算以第i个字符开头,长度为k的字符串总数
	public static int OneStep(int i,int k) {//i为第一个字符,k为字符串长度
		int sum = 0;
		if(k==1)
			return 1;
		else {
			for (int j = i+1; j <= 26; j++) {
				sum += OneStep(j, k-1);
			}
		}
		return sum;
	}
	
	public static int Count(String s) {
		int sum = 0;
		int k = s.length();
		
		for (int i = 1; i < s.length(); i++) //计算长度小于k的所有字符串数量
			for(int j = 1;j <= 26;j++)
			sum += OneStep(j, i);
		
		int n = s.charAt(0)-'a'+1;  //计算字符串开头字母是26个字母中的位置
		for (int i = 1; i < n; i++) //计算长度为k,以n字符之前字符开头的字符串数量
			sum += OneStep(i, k);
			
		for (int i = 1,p = n; i < k; i++) {//计算以字符p开头的剩余字符串数
			int m = s.charAt(i)-'a'+1;
			int L = k-i;
			for (int j = p+1; j < m; j++) {//计算从前一个首字母的后一位到当前首字母的字符串数量
				sum += OneStep(j, L);
				p = m;
			}
		}
		return sum+1;//返回前面三个sum的累加值及其本身
	}
}

2019年10月1日,恭祝祖国七十年华诞!我爱我国&家!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值