AcWing 190. 字串变换(搜索)

题目描述

题目链接

题目大意

  • 从字符串A到字符串B需要至少经过几次替换

解题思路

  • 双向广搜:从两个方向同时搜索,而不是从一个方向搜到另一个方向
  • 每次每一边只扩展一个点是不正确的,正确做法应该是每次每边扩展完整一层

题目代码

#include
#include
#include
#include
#include

using namespace std;

const int N = 6;

int n;
string A, B;
string a[N], b[N];

int extend(queue& q, unordered_map&da, unordered_map& db,
    string a[N], string b[N])
{
    int d = da[q.front()];
    while (q.size() && da[q.front()] == d)
    {
        auto t = q.front();
        q.pop();

        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < t.size(); j ++ )
                if (t.substr(j, a[i].size()) == a[i])
                {
                    string r = t.substr(0, j) + b[i] + t.substr(j + a[i].size());
                    if (db.count(r)) return da[t] + db[r] + 1;
                    if (da.count(r)) continue;
                    da[r] = da[t] + 1;
                    q.push(r);
                }
    }

    return 11;
}

int bfs()
{
    if(A == B) return 0;
    queue qa, qb;
    unordered_map da, db;

    qa.push(A), qb.push(B);
    da[A] = db[B] = 0;

    //int step = 0;
    while(qa.size() && qb.size())
    {
        int t;
        if(qa.size() < qb.size()) t = extend(qa, da, db, a, b);
        else t = extend(qb, db, da, b, a);

        if(t > A >> B;
    while(cin >> a[n] >> b[n]) n ++;

    int t = bfs();
    if(t == -1) puts("NO ANSWER!");
    else cout << t << endl;

    return 0;
}

Original: https://www.cnblogs.com/esico/p/16478082.html
Author: esico
Title: AcWing 190. 字串变换(搜索)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619907/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球