字典序问题(Java)
Description
在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由 26 个小写英文字母组成A={a,b,…,z}。该字母表产生的升序字符串是指字符串中字母按照从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次。例如,a,b,ab,bc,xyz等字符串都是升序字符串。现在对字母表A 产生的所有长度不超过6 的升序字符串按照字典序排列并编码如下。
对于任意长度不超过6 的升序字符串,迅速计算出它在上述字典中的编码。对于给定的长度不超过6 的升序字符串,计算出它在上述字典中的编码。
Input
输入数据的第一行是一个正整数k,表示接下来共有k行。接下来的k行中,每行给出一个字符串。
Output
将计算结果输出,共有k行,每行对应于一个字符串的编码,对于非法字符串序列输出0。
Sample Input
2
a
b
Sample Output
1
2
import java.io.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static String nextString() throws IOException {
in.nextToken();
return in.sval;
}
public static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
public static void main(String[] args) throws IOException {
int n = nextInt(); // 读入n行数据
char[] str; // 每行的字符串
int str_num[] = new int[10]; // 字符串长度不超过10
// 按字符串顺序存储每个字符的序列, a存1, b存2
while (n-- > 0) {
int sum = 0; //初始化为0
str = nextString().toCharArray(); // 输入的String转成char
boolean flag = false; // 非法字符串标志为false
// 从字符串第一个字符开始,挨个与后面相邻的作比较,判断是否为非法字符串
for (int i = 0; i < str.length - 1; i++)
if (str[i] >= str[i + 1] || str[i] < 'a' || str[i] > 'z') {
flag = true; //如果不是升序字符串或者有非小写字母的, 非法字符串标记true
break;
}
// 非法字符串输出0
if (flag) {
System.out.println(sum);
continue;
}
// 单个字母a为1, b为2, 后面加的都是除了本身的
// 比如a b c d, d为4, sum = 3(前三个), 还得补上本身的
// 比如ab是27, sum + 前面26个字母 = 26, 所以得先加一个1
sum++;
// 统计每个字母的编码, a = 1, b = 2 ...... z = 26
for (int i = 0; i < str.length; i++)
str_num[i] = str[i] - 'a' + 1;
// 计算小于当前长度的所有字符串情况
// 比如字符串dfgh, 计算字符串长度为1, 2, 3的所有情况
// a-z ab - yz abc - xyz abcd - dfgh
// 组合公式
for (int i = 1; i < str.length; i++)
sum += C(26, i);
// 从初始字母a开始, temp即为1
// 统计abcd - dfgh中间的个数
// abcd - axyz bcde - bxyz cdef - cxyz defg - dfgh
// d efg - d exy d fgh
// dfgh在str_num中存为{4, 6, 7, 8}
int temp = 1;
for (int i = str.length; i > 0; i--) { // 字符串越来越短
//从temp 计算到 str_num, a算到d(不包含d)
for (int j = temp; j < str_num[str.length - i]; j++)
sum += C(26 - j, i - 1);
//dfgh第一次循环计算abcd - axyz bcde - bxyz cdef - cxyz
temp = str_num[str.length - i] + 1; //temp存当前str_num元素 + 1
// dfgh第一次循环temp = 'd' - 'a' + 1 + 1 = 5; 也就是‘e’
// d efg - d exy d fgh
}
out.println(sum);
out.flush();
}
out.close();
}
//计算C(n,m) = n! / (m! * (n-m)!)
public static int C(int n, int m) {
int a, b;
a = 1;
b = 1;
for (int i = n; i > n - m; i--)
a *= i;
for (int i = 1; i <= m; i++)
b *= i;
return a / b;
}
}
字典序问题(Java)的更多相关文章
- Trie树的java实现
leetcode 地址: https://leetcode.com/problems/implement-trie-prefix-tree/description/ 难度:中等 描述:略 解题思路: ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java字典序全排列
import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...
- HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻 ...
- 字典序全排列(java实现)
import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...
- 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; priva ...
- java字典序排序
import java.util.Comparator; import java.util.ArrayList; import java.util.Collections; public class ...
- 46. 47. Permutations and Permutations II 都适用(Java,字典序 + 非字典序排列)
解析: 一:非字典序(回溯法) 1)将第一个元素依次与所有元素进行交换: 2)交换后,可看作两部分:第一个元素及其后面的元素: 3)后面的元素又可以看作一个待排列的数组,递归,当剩余的部分只剩一个元素 ...
- 31. Next Permutation (java 字典序生成下一个排列)
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
随机推荐
- redis 开启AOF 持久化
redis 开启AOF 找到redis 安装目录 打开 redis.conf 修改以下参数: appendonly yes (默认no,关闭)表示是否开启AOF持久化: append ...
- phpstorm 注解路由插件
idea-php-annotation-plugin 设置 插件 搜索 安装 重启
- git学习(十一) idea git pull 解决冲突
测试如下: 先将远程的代码修改,之后更新: 之后将工作区修改的代码(这里修改的代码跟远程修改的位置一样)提交到本地,之后拉取远程的代码,会发现有冲突: Accept Yours 就是直接选取本地的代码 ...
- JPA 相关API (一)
[Query 接口下的常用API] [API 测试类:Test_QueryAPI.java] 1 package org.zgf.jpa.entity; 2 3 import java.math.Bi ...
- ui 自动化的测试用例从哪来
从手工测试当中选取,尽量选择 1.简单且需要反复回归 2.稳定且不会经常变化 3.优先覆盖核心功能
- Luogu P4546 [THUWC2017]在美妙的数学王国中畅游
题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...
- pinpoint部署管理
本次pinpoint安装使用了docker环境安装,需要预先docker运行环境 1.安装docker环境 2.获取pinpoint-docker,安装命令 git clone https://git ...
- 300万运算/秒 :VoltDB在电信行业基准测试上可线性扩展性能
01 总 体 概 述 VoltDB受到全球电信软件解决方案提供商的信赖,后者将其作为首选内存数据库来驱动他们部署在全球100多家运营商处的任务关键型应用.VoltDB受到青睐的原因在于其性能和功能不仅 ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- 参悟python元类(又称metaclass)系列实战(一)
写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...