* 在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A由26个小写英文字母组成,即A={a,b...z}.该...

/*
* 在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A由26个小写英文字母组成,即A={a,b...z}.该

字母表产生的长序字符串是指定字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最

多出现1次.例如,a,b,ab,bc,xyz,等字符串是升序字符串.现在对字母表A产生的所有长度不超过6的升序字符串按照字

*/
package exam4;

import java.util.Scanner;

/**
*
* @author <a href="http://bobzone.iteye.com/" target="_blank">朱小波</a>
* @notes Created on 2011-4-28<br>
* 文 件 名 :
* CopyRright (c) 2011-xxxx:
* 文件编号:
* 创 建 人:朱小波
* 日 期:2011-4-28
* 修 改 人:
* 日 期:
* 描 述:
* 版 本 号:
*/
public class Test3 {

//递归计算以i开始的长度为k的所有数的个数,前提是升序
int amount(int i, int k) {
int sum = 0;
if (k == 1) {
return 1;
} else {
for (int j = i + 1; j <= 26; j++) {
sum += amount(j, k - 1);
}
}
return sum;
}
//计算长度为k的所有组合的个数,前提是升序

int amountZuhe(int k) {
int sum = 0;
for (int i = 1; i <= 26; i++) {
sum += amount(i, k);
}
return sum;
}
//转换成数字

int toInt(char c) {
return c - 'a' + 1;
}
//给出一个字符串返回一个序号

int getResult(String s) {
int k = s.length();
int sum = 0, temp = 0;
//获取1~k-1长度的子字符串数
for (int i = 1; i < k; i++) {
sum += amountZuhe(i);
}

//小于第一个字母的长度为k的所有组合个数
for (int i = 1; i < toInt(s.charAt(0)); i++) {
sum += amount(i, k);
}

//以第一个字母作为开始的字符串组合个数
temp = toInt(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
int t = toInt(s.charAt(i)); //获取此时的字母并转化成数字
int len = s.length() - i; //获取此时的长度
for (int j = temp + 1; j < t; j++) //获取比此时数字小,长度是此时的长度的所有组合的个数
{
sum += amount(j, len);
}
temp = t; //获取当前字符值,方便下一次从此项+1项开始累加
}
return sum + 1;
}

public static void main(String[] args) {
Test3 test3 = new Test3();
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
String str[] = new String[a + 1];
for (int i = 1; i <= a; i++) {
str[i] = sc.next();
}
for (int i = 1; i <= a; i++) {
System.out.println(test3.getResult(str[i]));
}

}
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要解密字符串string1,首先需要了解加密方式。根据题目的描述,加密方式为将string1中的每个字符转换成其对应的十六进制数,并在其前面加上一个加扰字符串中的随机字符,最终得到的加密字符串为由随机字符和十六进制数拼接而成的字符串。 要解密这个加密字符串,我们需要逆推回去,把加密字符串中的每个字符都还原成对应的十六进制数,然后再将它们转换成原字符。具体的操作步骤为:先将加密字符串按照加扰字符串中的随机字符进行分组,每组的前缀字符即是对应的随机字符。然后,对于每个分组,将其后面的十六进制数还原成原字符即可得到解密后的字符串需要注意的是,在还原十六进制数时,需要将每个字符转换为其对应的十进制数,然后再根据ASCII码表将其转换为原字符。如果加密字符串长度不是加扰字符串长度的整数倍,则说明最后一个分组的长度可能比较短,需要额外处理,不足的部分可以直接舍弃。 综上所述,解密字符串string1的具体步骤如下:先将加密字符串按照加扰字符串中的随机字符进行分组,然后依次对每个分组中的每个十六进制数进行还原,最后将还原后的字符拼接起来,就是解密后的字符串了。 ### 回答2: 字符串解密是一种编程技术,通常用于将经过加密字符串转换回原始的未加密状态。在字符串解密中,我们需要知道加密算法和加密密钥等相关信息才能对加密过的字符串进行解密操作。 对于给定字符串string1,它由小写英文字母和数字字符组成,加扰字符串由0-9、a-f组成。这种加密方式通常称为十六进制加密。具体来说,十六进制是一种基于16个数字(0-9和a-f)的计数系统。在十六进制中,每个数字代表4位二进制数,因此十六进制中的数字表示范围是0-15。 要解密这种加密方式的字符串,我们需要将每个十六进制字符转换为对应的十进制数,然后再将其转换为对应的小写英文字母或数字字符。具体步骤如下: 1.将加扰字符串中的每个十六进制字符转换为对应的十进制数。例如,字符'a'对应的十进制数是10,字符'f'对应的十进制数是15。 2.将转换后的每个十进制数按顺序以两个为一组,并将其转换为对应的小写英文字母或数字字符。例如,如果两个数字分别是7和13,则它们对应的字符是'h'和'd'。 3.将每个组成的字符连接起来,得到解密后的字符串字符串解密在实际开发中有很多应用,例如登录验证、密码重置等。在此过程中,为了保障用户的信息安全,我们通常会对用户输入的信息进行加密,以避免被恶意攻击者获取。而使用字符串解密技术则可以轻松地将加密的用户信息还原回原始状态,从而方便我们对其进行处理和验证。 ### 回答3: 将字符串解密是一个比较常见的问题,在实际应用中也经常遇到。一般来说,字符串解密就是将一种经过编码字符串转化为可读的字符串,方便我们阅读和理解。在此,我们将讨论一种字符串解密的方法,该字符串小写英文字母和数字字符组成,加扰字符串由0-9、a-f组成。 首先,我们需要明确加密算法的规则。我们假设字符串string1中的每一个字符都对应一个加密字符。如果一个字符在加扰字符串中出现了,则该字符对应的ASCII码加上加扰字符串中该字符所代表的数字(a对应10,b对应11,以此类推)。如果该字符在加扰字符中未出现,则该字符对应的ASCII码不变。 根据这个规则,我们可以编写字符串解密的代码。具体实现方式如下: 1. 首先定义两个变量,用于保存加密和加扰字符串。 string string1 = "egZ3mY3h8jLs5"; string jiami = ""; string jiasao = "1df4cb9a8e7"; 2. 然后遍历string1中的每一个字符,并按照规则对该字符进行解密。在遍历过程中,我们需要判断当前字符是否在加扰字符串中出现过,如果出现过,则需要根据加扰字符串中该字符所代表的数字进行解密。 for (int i = 0; i < string1.length(); i++) { char c = string1[i]; int asc = c; if ((asc >= 48 && asc <= 57) || (asc >= 97 && asc <= 122)) { int index = jiasao.find(c); if (index != string::npos) { asc += index + 10; } c = (char)asc; } jiami += c; } 3. 最终,我们可以得到解密后的字符串jiami,其中所有原本加密的字符都被还原成了可读的字符。我们可以输出jiami,以便进行查看和比较。 cout << jiami << endl; 通过以上的代码实现,我们可以比较轻松地将一个由小写英文字母和数字字符组成字符串解密。当然,实际应用中可能会有更加复杂的加密方式,需要我们根据具体情况进行相应的解密处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值