子串变换.java 2.1 KB
Newer Older
qq_36480062's avatar
c  
qq_36480062 已提交
1 2 3 4 5 6 7 8
package DFS.双向广搜;

import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Scanner;

/**
 * https://blog.csdn.net/qq_30277239/article/details/104723891
qq_36480062's avatar
c  
qq_36480062 已提交
9
 * 双向广搜,显然直接bfs会超时
qq_36480062's avatar
c  
qq_36480062 已提交
10
 */
qq_36480062's avatar
c  
qq_36480062 已提交
11
//@SuppressWarnings("all")
qq_36480062's avatar
c  
qq_36480062 已提交
12 13 14 15 16 17
public class 子串变换 {
    public static void main(String[] args) {
        String A, B;
        Scanner sc = new Scanner(System.in);
        A = sc.next();
        B = sc.next();
qq_36480062's avatar
c  
qq_36480062 已提交
18
        n = 0;
qq_36480062's avatar
c  
qq_36480062 已提交
19
        while (sc.hasNext()) {
qq_36480062's avatar
c  
qq_36480062 已提交
20 21
            aaa[n] = sc.next();
            bbb[n] = sc.next();
qq_36480062's avatar
c  
qq_36480062 已提交
22 23 24 25 26
            n++;
        }
        int step = bfs(A, B);
        if (step > 10) System.out.println("No");
        else {
qq_36480062's avatar
c  
qq_36480062 已提交
27
            System.out.println(step);
qq_36480062's avatar
c  
qq_36480062 已提交
28 29 30
        }
    }

qq_36480062's avatar
c  
qq_36480062 已提交
31
    static int n;
qq_36480062's avatar
c  
qq_36480062 已提交
32 33
    static ArrayDeque<String> qa = new ArrayDeque<String>(), qb = new ArrayDeque<String>();

qq_36480062's avatar
c  
qq_36480062 已提交
34

qq_36480062's avatar
c  
qq_36480062 已提交
35
    private static int bfs(String a, String b) {
qq_36480062's avatar
c  
qq_36480062 已提交
36 37
        HashMap<String, Integer> da = new HashMap<String, Integer>();
        HashMap<String, Integer> db = new HashMap<String, Integer>();
qq_36480062's avatar
c  
qq_36480062 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51
        qa.add(a);
        qb.add(b);
        da.put(a, 0);
        db.put(b, 0);
        while (!qa.isEmpty() && !qb.isEmpty()) {
            int t = 0;
            if (qa.size() <= qb.size()) {
                t = extend(qa, da, db, a, b);
            } else t = extend(qb, da, db, b, a);
            if (t <= 10) return t;
        }
        return 11;
    }

qq_36480062's avatar
c  
qq_36480062 已提交
52
    private static int extend(ArrayDeque<String> q, HashMap<String, Integer> da, HashMap<String, Integer> db, String a, String b) {
qq_36480062's avatar
c  
qq_36480062 已提交
53
        String t = q.poll();
qq_36480062's avatar
c  
qq_36480062 已提交
54 55 56 57 58 59 60 61 62
        for (int i = 0; i < (t != null ? t.length() : 0); i++) {
            for (int j = 0; j < n; j++) {
                if (!t.substring(i, aaa[j].length()).equals(aaa[j])) continue;
                String u = t.substring(0, i) + bbb[j] + t.substring(i + bbb[j].length());
                if (db.containsKey(u)) return da.get(t) + 1 + db.get(u);
                if (da.containsKey(u)) continue;
                da.put(u, da.get(t) + 1);
//                if ()
            }
qq_36480062's avatar
c  
qq_36480062 已提交
63
        }
qq_36480062's avatar
c  
qq_36480062 已提交
64
        return -1;
qq_36480062's avatar
c  
qq_36480062 已提交
65 66
    }

qq_36480062's avatar
c  
qq_36480062 已提交
67
    static int e;
qq_36480062's avatar
c  
qq_36480062 已提交
68
    static int N = 6;
qq_36480062's avatar
c  
qq_36480062 已提交
69
    static String[] aaa = new String[N], bbb = new String[N];
qq_36480062's avatar
c  
qq_36480062 已提交
70
}