对于前后字母不一样可以轻松判断,主要是对于前后字母大小一样情况下的讨论 例ACDBCB 第一个肯定取A 原字符数组就变为CDBCB 第二个肯定取B 原字符数组就变为CDCBC 这时候前后都为C,就需要我们去判断第二个字母的字典序了。 前面第二个字母为D,后面第二个字母为B,那我们就应该取最后一个了。 对于一些极端的字符数组,例如AAAAABAAA就需要连续判断到第四个字符,所以需要使用递归解决这种情况 第一次写题解,如果有疏漏,请指出,感谢
#include<stdio.h>
int max(int a, int b, char S[2010], char T[2010])//值传递,防止对原数据造成影响
{
a++;
b--; //由于对a,b进行更新,判断前面第二个字母与后面第二个字母的字典序
if (S[a] > S[b])
{
return 1; //如果前面第二个字母的 字典序 大于 后面第二个字母的字典序,返回1
}
else if (S[a] < S[b])
{
return 0; //如果前面第二个字母的 字典序 小于 后面第二个字母的字典序,返回0
}
else
{
return max(a, b, S, T); //如果前面第二个字母与后面第二个字母相同,递归函数,判断第三个字母的字典序
}
}
int main()
{
int x;
int a, b; //a表示取到S数组前面第几个字母了,b表示取到S数组后面第几个字母了
char S[2010], T[2010]; //创建两字符数组
scanf("%d", &x); //接收x
scanf("%s", S); //接收S数组
a = 0, b = x - 1; //对a b进行初始化,a为最小下标,b为最大下标
for (int i = 0; i < x; i++) //对整个字符串进行遍历,确保每一个字母都被分配
{
if (S[a] > S[b]) //由于只有大写字母,直接利用asc码进行比较,asc码小则字典序小
{
T[i] = S[b]; //将字典序小的赋给T
b--; //对b进行更新,表示最后一位字母已经被删除
}
else if (S[a] < S[b])
{
T[i] = S[a]; //同理
a++;
}
else //处理前面的字母等于后面字母的特殊情况
{
if ( max(a, b, S, T)) //调用函数 根据 返回值 判断取那个更好(转到代码第二行)
{
T[i] = S[b]; //如果返回真,则说明取前面的字母更好
b--; //对b进行更新
}
else
{
T[i] = S[a]; //如果返回假,则说明取后面的字母好
a++;
}
}
}
for (int i = 0; i < x; i++) //因为定义的一个大的字符数组,防止输出没用的字符,使用循环一个个输出
{
printf("%c", T[i]); //输出单个字符
}
return 0;
}

京公网安备 11010502036488号