字典序最小问题

package demo1;

import java.util.Scanner;

/**
 * 字典序的最小的问题
 * 	给定长度为N的字符串s,要构造一个长度为N的字符串T,开始T是一个空的字符串,随后反复进行下列的操作
 *
 * 	从S的头部删除一个字符,添加到T的尾部
 * 	从S的尾部删除一个字符,添加到T的尾部
 * 	不论顺序的执行上述的操作。
 * 构造一个尽量小的字符串。
 *
 *
 *
 * @author Administrator
 *
 */
public class Main {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();
		StringBuffer sb = new StringBuffer();
		String str = "";
		String T= "";
		for (int i = 0;i<N;i++){
			str = (sb.append(input.next())).toString();
		}
		//把字符串转化成数组
		char [] cs = str.toCharArray();
		int  a= 0;//表示的是下标
		int b = N-1;//表示的是下标

		while (a <= b) {//将从左起和从右起的字符串进行比较
			boolean left = false;
			for (int i=0;a+i<=b;i++) {
				if (cs[a+i]<cs[b-i]) {
					left = true;
					break;
				}else if (cs[a+i] >cs[b-i]){
					left = false;
					break;
				}
			}

			if (left) {
				T+=cs[a++];
			}else {
				T+=cs[b--];
			}

		}
		System.out.println(T);

	}

}
时间: 2024-10-15 10:44:02

字典序最小问题的相关文章

ZOJ 3204 Connect them(最小生成树之Krusal 输出字典序最小的)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers i and j is

贪心:字典序最小问题

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} 贪心:字典序最小问题 给定长度为 n 的字符串 s,要构造一个长度为 n 的字符串 t.起初,t 是一个空串,随后反复进行下列操作 1. 从 s 的头部删除一个字符,加到 t 的尾部 2. 从 s 的尾部删除一个字符,加到 t 的尾部 求 t 是字典序尽可能小的字符串 示例: n = 6 s

poj 1815 Friendship 字典序最小+最小割

题目链接:http://poj.org/problem?id=1815 In modern society, each person has his own friends. Since all the people are very busy, they communicate with each other only by phone. You can assume that people A can keep in touch with people B, only if 1. A kno

hdu1385 Minimum Transport Cost 字典序最小的最短路径 Floyd

求最短路的算法最有名的是Dijkstra.所以一般拿到题目第一反应就是使用Dijkstra算法.但是此题要求的好几对起点和终点的最短路径.所以用Floyd是最好的选择.因为其他三种最短路的算法都是单源的. 输出字典序最小的路径则需要修改模版. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N =1

[poj2337]求字典序最小欧拉回路

注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识了... CE怎么办啊...g++来救? #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define N 2020

C - 字典序最小的子序列 51nod1255

C - 字典序最小的子序列 Time Limit: 4000/2000 MS (Java/Others)      Memory Limit: 1280000/640000 KB (Java/Others) Submit Status Problem Description 给出一个由a-z组成的字符串S,求他的一个子序列,满足如下条件:1.包含字符串中所有出现过的字符各1个.2.是所有满足条件1的串中,字典序最小的.例如:babbdcc,出现过的字符为:abcd,而包含abcd的所有子序列中,

HDU 5335 Walk Out(Bfs搜索字典序最小的最短路)

 题意:nXm的地图, 问通过四个方向从(1,1)走到(1000,1000)所经过的最小二进制序列是多少,忽略前缀0. 思路:首先如果起点为0,那么我们bfs搜索和起点0联通的为0的连通块,这样我们第一步肯定是从与这个连通块相邻的且与重点最近的地方出发. 将所有可能起点加入队列,在bfs一遍找到字典序最小的那条路就是答案, 在这里可以用两个vector类型容器,一个是q2存储所有节点值存为0的结点, 另一个q3存储节点值为1的结点. 那么如果q2不为空那么也就是有可以走零,那么就从这里面选,

POJ 3617 - Best Cow Line(字典序最小) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3617 洛谷题目链接:https://www.luogu.org/problem/show?pid=2870 题目大意: 给定一个长度为N(1<=N<=30000)的字母序列,每次可以从序列头部或尾部取出一个字母加入一个队列的尾部,求此队列字典序最小的排列. 每输出80个字母,换行一次. 分析: 每次比较序列首部和尾部,取出较小的一个,如果相等就继续往下比较,直

3532: [Sdoi2014]Lis 最小字典序最小割

3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status][Discuss] Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案.如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种. 这题难点在如何求一组最小字典序最小的最小

HDU 1848 2SAT 输出字典序最小

告诉你两两冲突的序列,让输出字典序最小. 一开始老老实实tarjan,写完了发现后面完全不能好弄,因为选了第一个点,你没办法快速找出全部对立组,只能找出本来在一个pair中的那个对立组,而找不出给定的那个随意的对立组.所以直接从1开始染色,弄不出来就染2.以此类推. 这个题还有一个教训就是,点要多开一倍,边也要多开一倍.老是忘... #include<algorithm> #include<iostream> #include<cstdio> #include<c