【问题标题】:String Pathing BFS字符串路径 BFS
【发布时间】:2013-04-30 19:00:12
【问题描述】:

我正在尝试找到两个字符串之间的最短路径,并返回一个表示已执行多少步的整数。假设我有一个 HashMap,其中每个 String(key) 都有一个 String[](object) 包含所有字符串邻居。

这段代码是我编写的。我只是拿了一个基本的 BFS 并试图复制它,但我无法找到一种进步的方法。

public class Main {
private static HashMap<String, String[]> list;

private static int makePath(String from, string to) {

    int path = 0;
    PriorityQueue<String> queue = new PriorityQueue<>();
    queue.add(from);

    while (!queue.isEmpty()) {
        String u = queue.poll();
        if (u == to) {
            return path;
        }
        else {
            for (String r : list.get(u)) {

               ...

            }
            return path;
        }
    }
    return 0;
}

}

这只是我的 HashMap 的一个示例:

Goat, adj[] {Fish, Cow, Chicken}
Cow, adj[] {Pig, Pigeon}
Fish, adj[] {Goat, Bulbasaur, Dolphin, Eagle}

从鱼到牛我需要两个步骤。从鱼到山羊,从山羊到鱼。

所以如果你有任何想法,请随时分享:)

【问题讨论】:

  • “字符串路径”是什么意思?你的意思是像edit distance这样的东西吗?
  • 集合中两个字符串之间的路径。每个字符串都有一个它的邻居数组 - 包含在 HashMap 中。
  • 我认为他是想说他有一个图数据结构,并且正在寻找一些节点之间的最短路径算法。

标签: java string path breadth-first-search


【解决方案1】:

我正在考虑使用 2 个队列。我会将from 字排入第一个队列,而firstQueue 不为空,如果该邻居仍然不等于to,我将执行交替逻辑将邻居存储在另一个队列中。

我给代码会更清楚,

private static int makePath(final HashMap<String, String[]> tree, final String from, final String to) {

        int path = 0;
        Queue<String> firstQueue = new PriorityQueue<>();
        Queue<String> secondQueue = new PriorityQueue<>();
        firstQueue.add(from);

        while (!firstQueue.isEmpty()) {
            String key = firstQueue.poll();
            String[] neighbors = tree.get(key);
            if (neighbors != null) {
                path++;
                for (String neighbor : neighbors) {
                    if (neighbor.equals(to)) {
                        return path;
                    } else {
                        secondQueue.add(neighbor);
                    }
                }
            }

            while (!secondQueue.isEmpty()) {
                key = secondQueue.poll();
                neighbors = tree.get(key);
                if (neighbors != null) {
                    path++;
                    for (String neighbor : neighbors) {
                        if (neighbor.equals(to)) {
                            return path;
                        } else {
                            firstQueue.add(neighbor);
                        }
                    }
                }

            }

        }
        return 0;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2012-10-08
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多