[算法课][贪心]W12例1字典序最小问题 原创
题目来源 算法课
算法标签 字符串,贪心
题目描述
问题描述:
给定长度为N的字符串S,
要构造一个长度为N字符串T。
T开始是一个空串,反复执行下列任意操作:
1)从S的头部删除一个字符,加到T的尾部;
2)从S的尾部删除一个字符,加到T的尾部;
目标是要构造字典序尽可能小的字符串T。
PS:
字典序是指从前到后比较两个字符串的大小的方法。
首先比较第1个字符,如果不同
则第1个字符较小的字符串更小,
如果相同则继续比较第2个字符…
反复继续,来比较整个字符串的大小。
输入 ACDBCB
输出 ABCBCD
颜老板代码
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
int n;
char *s;
int zb,yb;
printf("请你输入一个字符串的长度:");
scanf("%d",&n);
getchar();
s=(char *)malloc(n+1);
printf("输入一个字符串:");
gets(s);
zb=0;
yb=n-1;
//*(s+?) 表示s中第?个位置上的字符的值 s[?]
//谁小谁输出
while(zb<=yb)
{
int left=0; //left=0,表示左边字符小,left=1,表示左边字符大
int i;
for(i=0;zb+i<=yb;i++)
{
if(*(s+zb+i) < *(s+yb))//左边小,左边的是该输出
{
left=0;
break;
}
else if(*(s+zb+i) > *(s+yb))//左边大,右边的是该输出
{
left=1;
break;
}
}
if(left==1)
{
putchar(*(s+yb));
yb--;
}
else
{
putchar(*(s+zb));
zb++;
}
}
return 0;
}
吐槽
纯C代码写字符串真的是让我和小伙伴在台下看得一言难尽
建议用CPP,用String,用reverse
所以我们只理解做题思路,直接A
思路
从PS这一番话里我们知道是字符串前后向中间持续比较字符大小
(1)安全版
为了防止下标问题我们可以直接拆分
例如
A::ACDBCB t1
B::BCBDCA t2
给AB数组分别一个INDEX,在AB数组持续找最小,然后赋值给res数组
输出res答案即可
(2)极简版
需要注意下标处理和生成逻辑
AC代码
安全版
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<char>ans;
int main()
{
string a;
cin>>a;
string b=a;
reverse(b.begin(),b.end());
int t1,t2,t3;
t1=t2=t3=0;
while(1)
{
if(a[t1]<=b[t2])ans.push_back(a[t1++]),t3++;
else ans.push_back(b[t2++]),t3++;
if(t3==a.size())break;
}
for(int i=0;i<ans.size();i++)cout<<char(ans[i]);
return 0;
}
非安全,极简版
需要注意下标处理和生成逻辑
#include<iostream>
using namespace std;
int main()
{
string a;
cin>>a;
int l=0,r=a.size()-1;
while(l<=r)
if(a[l]<a[r])cout<<a[l++];
else cout<<a[r--];
return 0;
}
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!