字典序最小问题

/*给定一个长度为N的字符串S ,要构造一个长度为 N的字符串T 。起初 T是一个空字符串,随后反复进行以下操作
 1 从S的头部删除一个字符 加到T的尾部
 2 从S的尾部删除一个字符 加到T的尾部
 目标是要构造是 字典序最小的字符串T
 S 只包含大写字母*/
 #include<iostream>
 #include<cstring>
 #include<algorithm>
 #include<queue>
 using namespace std;
 int n;
 char s[1000];
 void solve (){
 	
 	int a=0,b=n-1;
	while(a<=b){
		bool left=false;
		for (int i=0;i+a<=b;i++){
			if(s[a+i]<s[b-i]){
				left=true;
				break;
			}
			else if(s[a+i]>s[b-i]){
				left=false;
				break;
			}
		}
		if(left) putchar (s[a++]);
		else putchar (s[b--]);
	}
	puts("");
 } 
 int main (){
 	cin>>n;
 	getchar();
 	gets(s);
 	solve();
 	return 0;
 }

 

### 字典序最小算法的实现方法 字典序是一种常见的字符串比较方式,其核心在于逐位对比字符的ASCII码值。为了找到字典序最小的结果,通常会涉及一些特定的操作,比如去重、重新排列或者删除某些字符。 #### 去重并保持字典序最小 对于给定的小写字符串`str`,目标是删除多余的重复字符,使每种字符仅保留一次,并确保结果字符串具有最小字典序[^2]。以下是具体的实现逻辑: 1. **维护访问状态**:创建一个布尔数组或集合用于记录某个字符是否已被加入结果序列。 2. **计数统计**:通过遍历输入字符串构建频率表,了解每个字符剩余的数量。 3. **贪心策略应用**:利用栈结构存储当前候选字符,在满足条件的情况下弹出较大的字符以保证整体顺序最优。 下面是基于上述原理的一种Python实现方案: ```python def removeDuplicateLetters(s): last_occurrence = {c: i for i, c in enumerate(s)} # 记录最后一次出现的位置 stack = [] seen = set() for idx, char in enumerate(s): if char in seen: continue while stack and char < stack[-1] and last_occurrence[stack[-1]] > idx: removed_char = stack.pop() seen.remove(removed_char) stack.append(char) seen.add(char) return ''.join(stack) ``` 此函数首先建立字母最后位置映射表以便后续判断能否移除某元素;接着运用循环迭代每一个待处理符号,依据既定规则调整堆叠内容直至完成全部操作流程。 #### 排列组合中的字典序生成 当面对全排列场景下的字典序需求时,则可借助回溯技术减少不必要的移动次数从而提升效率[^1]。这类问题往往围绕如何高效枚举所有可能情况展开讨论。 --- ### 示例分析 假设输入串为 `"cbacdcbc"` ,按照以上描述执行过程如下: - 初始化 `last_occurrence={'c':7,'b':6,'a':2,'d':4}` 和空列表作为栈; - 遍历时依次考虑各单元格数据关系,最终得到输出结果 `"acdb"` 符合预期设定标准即最小子序列形式呈现出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值