字典序最小问题

给定长度为N的字符串S,要构造一个长度为N的字符串T。期初,T是一个空串,随后反复进行下列任意操作:
从S的头部删除一个字符,加到T的尾部;从S的尾部删除一个字符,加到T的尾部。
目标是要构造字典序尽可能小的字符串T。
当N=6,输入S="ACDBCB"时,输出T="ABCBCD"。
将S反转后的字符串定为S',比较S和S'的字典序,如果S较小则从S开头取字符加到T的末尾,反之从S末尾取字符加到T的末尾。

#include <stdio.h>
#include <tchar.h>
#include <queue>
#include "iostream"

using namespace std;

const int N = 6;
char S[N] = "ACDBCD";

char* solve(char S[])
{
	int start = 0, end = N - 1;
	bool isLeft = false;
	char T[N];
	while(start <= end) {
		for(int i = 0; start + i < end; i++)
		{
			if(S[start + i] < S[end - i]) 
			{
				isLeft = true;
				break;
			}
				
			else if(S[start + i] > S[end -i])
			{
				isLeft = false;
				break;
			}
			else 
				continue;
		}
		if(isLeft)
		{
			T[N-(end - start + 1)] = S[start++];
		}
		else
		{
			T[N-(end - start + 1)] = S[end--];
		}
	}
	
	return T;
}

int main() {
	char *result = solve(S);
	for(int i=0; i<N; i++) 
	{
		putchar(result[i]);
	}
	return 0;
}
From 计蒜客

### 字典序最小的定义 字典序最小(Lexicographical Order Minimum)是字符串排序中的一种概念,类似于单词在字典中的排列顺序。对于两个字符串,它们的比较是从左到右逐个字符进行的。在第一个不同的字符位置上,字符较小的字符串被认为在字典序中更靠前。如果一个字符串是另一个字符串的前缀,则较短的字符串被认为在字典序中更小。 例如,对于字符串 "abc" 和 "abd",在第一个不同字符的位置(第三个字符)上,'c' < 'd',因此 "abc" 的字典序小于 "abd"。 ### 示例 以下是几个具体的例子来说明字典序最小的概念: 1. **字符串比较**: 对于字符串 "apple" 和 "apply",它们的第一个不同字符出现在第四个位置,'e' < 'l',因此 "apple" 的字典序小于 "apply"。 2. **数字字符串比较**: 对于字符串 "0158" 和 "0190",它们的第一个不同字符出现在第三个位置,'5' < '9',因此 "0158" 的字典序小于 "0190" [^2]。 3. **操作后字典序最小的字符串**: 以输入 `s = "74"`、`a = 5`、`b = 1` 为例,通过轮转和累加操作可以得到多个结果字符串,其中字典序最小的字符串是 "24"。这是因为 "24" 在所有可能的变换结果中具有最小字典序 [^3]。 ### 字典序最小的应用场景 字典序最小的概念在计算机科学中有广泛的应用,例如: - **字符串排序**:对字符串数组进行排序时,通常使用字典序作为排序规则。 - **数据处理**:在数据库查询或文件系统操作中,字典序用于确定数据的排列顺序。 - **算法设计**:许多算法(如贪心算法或动态规划)会利用字典序最小的特性来优化结果。 例如,在 Python 中,可以通过内置的 `sorted()` 函数对字符串列表进行字典序排序: ```python words = ["banana", "apple", "cherry"] sorted_words = sorted(words) print(sorted_words) # 输出:['apple', 'banana', 'cherry'] ``` ### 字典序最小的特殊性质 字典序最小具有以下特性: - **传递性**:如果字符串 A 的字典序小于字符串 B,且字符串 B 的字典序小于字符串 C,那么字符串 A 的字典序也小于字符串 C。 - **唯一性**:在一个字符串集合中,字典序最小的字符串是唯一的,除非集合中存在完全相同的字符串。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值