蓝桥云课-删除字符C语言、java解法

题目描述

给定一个单词,请问在单词中删除 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]);
            }
        }
    }


昨晚学妹找我问这道题目,今天终于把思路整理清晰了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值