首页 > Web开发 > 详细

B.Azamon Web Services

时间:2019-12-27 18:43:23      阅读:116      评论:0      收藏:0      [点我收藏+]

题意:帮助Jeff去改良她产品的名字,使得她产品名字的字典序小于她的对手。
给出字符串s,表示Jeff的产品名字,给出字符串c,表示她竞争对手的产品名字,找出一种方式,至多交换一对s中的字符,使得Jeff的产品名字字典序严格小于她的竞争对手。

字典序严格小于的定义:对于字符串a和字符串b
只要满足如下一个,字符串a的字典序严格小于b
1.a是b的一个前缀,且a 不等于 b
2.存在一个整数1 <= i <= min(|a|, |b|),ai < bi,还有aj = bj(1 <= j < i)
//第二个条件的意思是说a和b的前j个字符相等,但是第i个字符 ai < bi

输入
t:t组数据(1 <= t <= 1500)
每组数据包含两个字符串s和c(2 <= |s| <= 5000,1 <= |c| <= 5000),字符串s和字符串c由大写字符组成。

分析:我们可以从前往后遍历s,在当前字符的时候,寻找后面是否存在比当前字符小的字符,并且是最小的,使得交换后的字符串字典序小于c。//如果不存在的话,说明该字符后面的字符都小于当前字符,
说明这个位置是个无法变小的位置,因此我们在继续后面的遍历,如果后面存在比当前字符小的字符,那么就交换,为什么交换后就break循环呢?因为如果当前字符交换完,那么遍历到后面的字符时,即使交换了,也不会比这次交换,带来的字符串更小,所以一旦第一次出现可以交换的现象,就break。
并且如果后面存在多个可以交换的字符(即最小的且相等的)那么我们就交换最后一个,因为这样就会把当前字符放在很后面。

#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int t;
    scanf("%d", &t);

    string s, c;

    while (t--)
    {
        cin >> s >> c;
        for (int i = 0; i < (int)s.length(); ++i)
        {
            int pos = i;
            for (int j = s.length() - 1; j >= i; --j)
            {
                //寻找后面一个最小的字符
                if (s[j] < s[pos]) pos = j;
            }
            if (pos != i)
            {
                swap(s[pos], s[i]);
                break;
            }
        }
        if (s < c)
            cout << s << endl;
        else
            cout << "---" << endl;
    }
    return 0;
}

B.Azamon Web Services

原文:https://www.cnblogs.com/pixel-Teee/p/12108804.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!