1

有重复的字符串(全小写)的全排列个数

输入描述

输入字符串中无空格;字符个数不超过8个;

输出描述

示例1

输入

abc

输出

6

说明

acb bca abc cba bac cab

示例2

输入

aab

输出

3

备注

输入为空,输出为0

备注

组合数学问题:有重集合全排列数(n!/(n1!...nk!))

例如:abb=>{abb,bab,bba}个数为3,等价于3!/(1!2!) = 6/(12) = 3

2

假设两台计算机之间有一种特殊的协商密钥的方式:A计算机先发给B一个字符串M,B再发给A一个数字k,从M中移除k个字母后,得到的字典序最小的字符串即为两者后续通信的密钥。
试根据给定的M和k,返回最终合法的密钥。
字符串M中仅包括小写英文字母,100000>=M.len>k;

输入描述

第一行为字符串
第二行为数字,表示从字符串中移除几位

输出描述

移除若干字母后的字典序最小的字符串

备注

单调栈:维护一个单调递增栈
当入栈元素大于栈顶则入栈,
当入栈元素小于栈顶则栈顶出栈,一直到栈顶比入栈元素小或出栈个数为K时停止入栈。
停止入栈情况
1:字符串遍历结束,但出栈个数小于K,则一直出栈删除到栈中元素为M-K个,在放入StringBuffer中
2:字符串未遍历结束,但出栈个数等于K,则现将栈中元素放入StringBuffer中再将剩余的放入StringBuffer中
最后输出StringBuffer
例如:字符串为bacaa,去掉2个字符,返回baaa

3

鲍勃和爱丽丝在网上认识了,两人住在不同的城市。鲍勃决定去爱丽丝住的城市约会。
用数字命名的N个城市,单行道相连。每条道路都有两个相关的参数:道路长度和道路需要支付的通行费(以硬币的数量表示)。
我们想要帮助鲍勃找到从城市1到城市N的最短路径,同时有足够的硬币花销。

输入描述:

输入的第一行包含整数K,0<=K<=10000,这是鲍勃可以在路上花费的最大的硬币数。 第二行包含整数N,2<=N<=100,表示城市的总数。第三行包含整数R,1<=R<=10000,即道路总数。 以下每R行通过指定整数S、D、L和T以单个空白字符分隔来描述一条道路: S是源城市,1<=S<=N
D是目的地城市,1<=D<=N
L是道路长度,1<=L<=100 T为通行费(以硬币数量表示),0<=T<=100
注意,不同的道路可能有相同的来源和目的地城市。

输出描述

输出的行是从城市1到城市N的最短路径的总长度,该最短路径的总代价小于或等于K个硬币。
如果不存在这样的路径,那么应该只将-1写入输出。
N个城市,编号1到N。城市间有R条单向道路。每条道路连接两个城市,有长度和过路费两个属性。
鲍勃只有K块钱,他想从城市1走到城市N。问最短共需要走多长的路。如果到不了N,输出-1。

输入

1
2
3
4
5
6
7
8
9
10
5
6
7
1 2 2 4
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2

输出

1
11