/**
* 给定长度为N的字符串S(只包含大写英文字母),要构造一个长度为N的字符串T。
* 起初,T是一个空字符串,随后反复进行下列任意操作
* 1.从S的头部删除一个字符,加到T的尾部
* 2.从S的尾部删除一个字符,加到T的尾部
* 目标是要构造字典序尽可能小的字符串T
* 字典序是指从前到后比较两个字符串大小的方法。首先比较第1个字符,如果不同则第一个字符小的字符串更小,
* 如果相同则继续比较第2个字符...如此继续来比较整个字符串的大小.
* @author haofan.whf
* @version $Id: BestCowLine.java, v 0.1 2018年06月12日 下午6:42 haofan.whf Exp $
*/
public class BestCowLine {
/**
* 思路,贪心算法
* 要组成最小字典序的字符串我们只需要不断的将S.charAt(0)和S.charAt(S.length-1)中
* 较小的那个添加到结果字符串的尾部即可
* 唯一的问题是当S.charAt(0)==S.charAt(S.length-1)
* 我们还需要继续比较S.charAt(1)和S.charAt(S.length-2)...直到分出大小为止
* 那么由特殊到一般,我们要做的就是比较
* S.charAt(0 + i)==S.charAt(S.length - 1 - i)的大小
* if(S.charAt(0 + i) < S.charAt(S.length - 1 - i)){
* 将S头部的字符放入结果尾部
* }else{
* 将S尾部的字符放入结果尾部
* }
* @param N
* @param S
*/
public void solution(int N, String S){
StringBuilder tsb = new StringBuilder();
int start = 0;
int end = N - 1;
while (start <= end){
boolean left = false;
for (int i = 0; start + i <= end; i++) {
if(S.charAt(start + i) < S.charAt(end - i)){
left = true;
break;
}else if(S.charAt(start + i) > S.charAt(end - i)){
left = false;
break;
}
}
if(left){
tsb.append(S.charAt(start ++));
}else{
tsb.append(S.charAt(end --));
}
}
System.out.println(tsb);
}
}
字典序最小问题
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...