当前位置:网站首页 > Java基础 > 正文

java基础字典表设计




https://www.codewars.com/kata/58ad317d1541651a740000c5/java


一个串的全排列 例如abc 为 "abc", "acb", "bac", "bca", "cab", "cba"

求全排列的算法为 循环该串,轮流取出一个字符,之后再求剩下的串的全排列在进行合并。

字典序意思是两个串比较,字符顺序小的在前,比如按照字典序"acb"<"bac"

该题要求一个串的字典序全排列的中间值,第一反应是不能按照暴力法求出全排列再取中值,因为全排列是n!增长的。

那么接下来找规律,可以看到每个字符开头的全排列个数是相同的,假设输入为abcd,他的字典序全排列为

[abcd, abdc, acbd, acdb, adbc, adcb, bacd, badc, bcad, bcda, bdac, bdca, cabd, cadb, cbad, java基础字典表设计 cbda, cdab, cdba, dabc, dacb, dbac, dbca, dcab, dcba]

可以看出,如果输入字符串为偶数的话,那么中间值就是b开头的最后一个排列即bdca,也就是以b开头的串字典序最大的值,因为字典序是最大的,所以b后面的字幕为逆字典序。

偶数的中间值位置示意如下

java 级联字典查询所有末级_bc

如果是奇数的话,那么中值示意如下。

java 级联字典查询所有末级_全排列_02

可以看出是中间那块的中值,那么这个怎么求呢,因为奇数减去一个值就是偶数,所以还是先算出开头字母,将其减掉得出一个新的字符串,转化为偶数情况。

按照此规律编写代码如下

此算法最多只要计算两次,所以为O(1)时间复杂度,不过该题的输入不是按顺序的,所以需要先进行排序,那么时间复杂度就是O(nlogn)了。

在浏览其他人答案的时候似乎还有一些别的规律,看到一个只用算一次的算法如下

版权声明


相关文章:

  • JAVA并发基础的书籍2024-10-17 14:18:05
  • 从事软测试 需要c java 基础2024-10-17 14:18:05
  • java基础应用题2024-10-17 14:18:05
  • 30岁后零基础转行java2024-10-17 14:18:05
  • java入门基础教程12024-10-17 14:18:05
  • 杜老师java基础2024-10-17 14:18:05
  • java基础封装概念和实例2024-10-17 14:18:05
  • java基础小项目实例2024-10-17 14:18:05
  • java数组的基础2024-10-17 14:18:05
  • java基础坐Java Swing的层次结构深入理解2024-10-17 14:18:05