栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

awoo‘s Favorite Problem(优先队列)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

awoo‘s Favorite Problem(优先队列)

原题链接 题目描述

给你两个字符串s和t,长度都是n。两个字符串中的每个字符都是’a’, ‘b’或’c’。

在一个操作中,您可以执行以下操作之一:

选择s中出现的“ab”,将其替换为“ba”;

选择s中出现的“bc”,并将其替换为“cb”。

你可以执行任意数量的移动(可能是零)。 你能改变字符串s让它等于字符串t吗?

输入样例
5
3
cab
cab
1
a
b
6
abbabc
bbaacb
10
bcaabababc
cbbababaac
2
ba
ab
输出样例
YES
NO
YES
YES
NO

算法 (贪心 + 优先队列 + 模拟)

贪心策略:通过优先队列记录每个字母的下标,每次如果有可换的字母对则取最近的下标观察是否可以交换,没有则直接弹出该字母。

C++ 代码

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll a[N],s[N];

void solve()
{
    int n;
    cin >> n;
    string s,t;
    cin >> s >> t; 
    vector v1(3,0),v2(3,0);
    for (int i = 0;i < n;i ++ ) v1[s[i] - 'a'] ++;
    for (int i = 0;i < n;i ++ ) v2[t[i] - 'a'] ++;

    if (v1 == v2) {
        priority_queue,greater>a,b,c;
        for(int i = 0;i < n;i ++ ) {
            if(s[i] == 'a') a.push(i);
            if(s[i] == 'b') b.push(i);
            if(s[i] == 'c') c.push(i);
        }
        for (int i = 0;i < n;i ++ ) {
            if (s[i] == t[i]) {
                if (s[i] == 'a') a.pop();
                else if (s[i] == 'b') b.pop();
                else c.pop();
            }else {
                if (s[i] == 'a' && t[i] == 'b') {
                    if (!b.empty() && (c.empty() || b.top() < c.top())) {
                        int index = b.top();
                        b.pop();
                        swap(s[i],s[index]);
                        a.pop();
                        a.push(index);
                        continue;
                    }
                }else if (s[i] == 'b' && t[i] == 'c') {
                    if (!c.empty() && (a.empty() || c.top() < a.top())) {
                        int index = c.top();
                        c.pop();
                        swap(s[i],s[index]);
                        b.pop();
                        b.push(index);
                        continue;
                    }
                }
                puts("NO");
                return;
            }
        } 
        puts("YES");
    }else puts("NO");
}
int main()
{
    int t;
    cin >> t;
    while (t -- ) solve();
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号