题目描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表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日,恭祝祖国七十年华诞!我爱我国&家!!!
本文介绍了一种针对升序字符串的编码算法实现,该算法能够计算特定字符串在字典中的编码位置。通过递归方式计算不同长度的升序字符串数量,并结合字符串特征完成最终编码。

838

被折叠的 条评论
为什么被折叠?



