码迷,mamicode.com
首页 > 其他好文 > 详细

贪心:字典序最小问题

时间:2015-04-07 23:19:01      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

贪心:字典序最小问题

贪心:字典序最小问题

给定长度为 n 的字符串 s,要构造一个长度为 n 的字符串 t。起初,t 是一个空串,随后反复进行下列操作
1. 从 s 的头部删除一个字符,加到 t 的尾部
2. 从 s 的尾部删除一个字符,加到 t 的尾部
求 t 是字典序尽可能小的字符串
示例:
  n = 6
  s = "ACDBCB"
    构造 t
      t: a            s: cdbcb
      t: ab           s: cdbc
      t: abc          s: cdb    # 注意这里选择的 c 的方向,选错了就不是最小
      t: abcb         s: cd
      t: accbc        s: d
      t: abcbcd       s:

看算法实现吧,很容易明白的,反正我是看明白了

// CreateTime: 2015-04-07 21:55:59

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>

using namespace std;

string s;
string t;

void solve() {
    cin >> s;
    int len = s.length();
    int l = 0;
    int r = len-1;

    int sub = 0;

    while (l <= r) {
        bool left = 0;
        for (int i = 0; l+i <= r; i++) {
            if (s[l+i] < s[r-i]) {
                left = 1;
                break;
            } else if (s[l+i] > s[r-i]) {
                left = 0;
                break;
            }
        }
        if (left) {
            t[sub++] = s[l++];
        } else {
            t[sub++] = s[r--];
        }
    }
    t[sub] = ‘\0‘;
//    cout << t << endl;         // 不明白为什么不能输出
    cout << t.c_str() << endl;
}

int main(void) {
    solve();

    return 0;
}

贪心:字典序最小问题

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4399788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!