题目描述
给定一个单词,请问在单词中删除 tt 个字母后,能得到的字典序最小的单词是什么?
输入描述
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 tt。
其中,单词长度不超过 100100,tt 小于单词长度。
输出描述
输出一个单词,表示答案。
输入输出样例
示例
输入:
LANQIAO
3
输出:
AIAO
解法一(学妹解法,C语言):
#include <stdio.h>
#include <string.h>
char str1[10000],str2[10000];
int t,j=0,m,n;
char min;
void delect(int a,int t1,int j);
int main()
{
int i;
gets(str1);
scanf("%d",&t);
m=strlen(str1);
delect(0,t,0);
return 0;
}
void delect(int a,int t1,int j)//字符串str1目前的位置,需要删除的个数,str2字符串目前的下标
{
//printf("%d\n",t1);
int i;
min=str1[a];
for(i=a;i<=a+t1;i++)//找到当前可删除的最小元素
{
if(str1[i]<min)
{
min=str1[i];
n=i;
}
}
if((m-n)==(m-t)&&t1!=0) //其后元素不可以再被删除
{
if(j==0)
{
for(i=t;i<m;i++)
{
printf("%c",str1[i]);
}
}
else
{
for(i=n;i<m;i++)
{
str2[j]=str1[i];
j++;
}
puts(str2);
}
}
else if(n!=t1&&t1!=0)
{
str2[j]=min;
j++;
t--;
delect(n+1,t,j);//字符串str1目前的位置,需要删除的个数,str2字符串目前的下标
}
else if(t1==0&&str1[n+1]=='\0')
puts(str2);
else if(t1==0&&str1[n+1]!='\0')
{
for(i=n+1;str1[i]!='\0';i++)
str2[j]=str1[i];
puts(str2);
}
return;
}
来看看编译的结果:
输入样例一:LANQIAO
3
输出样例一:AIAO
输入样例二:AAABBBCCC
3
输出样例二:AAAC
这个题解是可以通过蓝桥的系统的,但是当输入样例二后输出的结果却不是我们所期待的。
解法二:(C语言)
/*
字典序最小单词
遍历所有的可能,找到字典序最小的。
*/
#include <stdio.h>
#include <string.h>
char a[101];
int book[101];
char jg[101];
char b[101];
void fuzhi(char aa[],char bb[]){
int i;
for(i=0;bb[i];i++){
aa[i] = bb[i];
}
aa[i] = 0;
}
int bijiao(char aa[],char bb[]){
int i;
for(i=0;aa[i]!=0 && bb[i]!=0;i++) {
if(aa[i]!=bb[i])
return aa[i]-bb[i];
}
}
void dfs(int len,int t,int step) {
//已经填了t个了,使用strcmp比较
int i,j;
int temp;
if(step==t)
{
j=0;
for(i=0;i<len;i++)
{
if(a[i]!=-1)
{
b[j] = a[i];
j++;
}
}
b[j] = 0;
//如果这个b比jg小,那么它成为新的结果
if(bijiao(b,jg)<0)
{
fuzhi(jg,b);
}
return;
}
for(i=0;i<len;i++){
if(book[i] == 0){
temp = a[i];
a[i] = -1;
book[i] = 1;
dfs(len,t,step+1);
book[i] = 0;
a[i] = temp;
}
}
}
int main() {
char arr[101];
int t,i,len,maxi,j;
scanf("%s",arr);
scanf("%d",&t);
len = strlen(arr);
fuzhi(a,arr);
for(i=0;i<len;i++) {
jg[i] = 127;
}
jg[i] = 0;
dfs(len,t,0);
printf("%s",jg);
return 0;
}
输入样例一:LANQIAO
3
输出样例一:AIAO
输入样例二:AAABBBCCC
3
输出样例二:AAABBB
虽然有点baoli,但是两个样例都通过了。
解法三(精简版C语言代码):
#include<stdio.h>
#include <string.h>
int main() {
char ch[101];
int t,len,n,si=-1,j,i;
char ct;
scanf("%s",&ch);
scanf("%d",&t);
n = strlen(ch)-t;
for(i = n;i > 0;--i)
{
++si;
ct = 'Z';
for(j = si;j < strlen(ch)-i+1;++j) {
if(ch[j] < ct) {
si = j;
ct = ch[j];
}
}
printf("%c",ch[si]);
}
return 0;
}
输入样例一:LANQIAO
3
输出样例一:AIAO
输入样例二:AAABBBCCC
3
输出样例二:AAABBB
这种法我觉得是最简单的一种方法。
java代码:
import java.util.Scanner;
public class danci {
public static void main(String[] args) {
//创建输入对象
Scanner sc = new Scanner(System.in);
//把输入的放在字符数组里面
char[] ch = sc.next().toCharArray();
int t = sc.nextInt(), n = ch.length-t, position = -1;
for(int i = n; i > 0; --i)//总共找n个数,一次只一个字母,贪心每次找一个最小的
{
++position;
char ct = 'Z';
for(int j = position; j < ch.length-i+1; ++j) {
if(ch[j] < ct) {
position = j;
ct = ch[j];
}
}
System.out.print(ch[position]);
}
}
}
昨晚学妹找我问这道题目,今天终于把思路整理清晰了。