首页 > 试题广场 >

第K小子串(客户端开发卷)

[编程题]第K小子串(客户端开发卷)
  • 热度指数:4829 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
输入一个字符串 s,s 由小写英文字母组成,保证 s 长度小于等于 5000 并且大于等于 1。在 s 的所有不同的子串中,输出字典序第 k 小的字符串。
字符串中任意个连续的字符组成的子序列称为该字符串的子串。
字母序表示英文单词在字典中的先后顺序,即先比较第一个字母,若第一个字母相同,则比较第二个字母的字典序,依次类推,则可比较出该字符串的字典序大小。

数据范围:
进阶:空间复杂度 , 时间复杂度

输入描述:
第一行输出一个字符串 s,保证 s 长度小于等于 5000 大于等于 1。
第二行一个整数 k (1<= k <= 5),保证 s 不同子串个数大于等于 k。


输出描述:
输出一个字符串表示答案。
示例1

输入

aabb
3

输出

aab

说明

不同的子串依次为:
a aa aab aabb ab abb b bb
所以答案为aab
示例2

输入

aaa
3

输出

aaa
//将获取的字符串分割成数组
var arr1 = readline().split('') 
//注意不能直接将arr1赋值给arr5,因为直接赋值会导致arr5排序时arr1也会跟着排序
var arr5 =Array.from(arr1)      
var arr2 = []
//获取k
var n = parseInt(readline())
//对arr5按照字典序排序
arr5.sort()
//遍历arr1寻找跟arr5首位一样的字母,找到之后从该字母开始进行循环
//这个次数只要为n+i就可以了,因为题目输入的k的范围(1<= k <= 5)
//不然输出超出空间限制
for(let i = 0;i<arr1.length;i++){
    if(arr1[i]===arr5[0]){
        for(let j =i;j<n+i;j++){
        arr2.push(arr1.slice(i, j + 1))    
    }
   }
}
//将得到的arr2数组进行map操作,每一项都拼接成字符串返回并赋值到arr3
var arr3 =arr2.map(item => item.join(''))
//数组去重
var arr4=[...new Set(arr3)]
//arr4按照字典序排序
arr4.sort()
//输出按照字典序排序后的第k小的字符串
console.log(arr4[n-1])
 js实现的,感觉很多题目都很少用js实现的代码。。这对前端同学也太不友好了吧。。
发表于 2021-08-23 14:09:18 回复(2)