当前位置: 首页 > 知识库问答 >
问题:

在网格中查找字符序列以形成字符串(每次向下或向右移动一步)

林英锐
2023-03-14

我得到了一个n乘n的字符网格和一个字符串。我想找到一条路径(n中(I,j)对的序列),这样它们就形成了一条拼出s的路径。我可以从网格中的任何地方开始,但我只能在网格中向右或向下移动一步。

解决这个问题的有效方法是什么?我看了一个类似的问题,你可以在各个方向移动。但是,既然我们只能向右或向下移动,我们还能改进什么呢?

共有1个答案

陈和裕
2023-03-14

首先,让我们在将要使用的图结构中定义一个节点。出于我们的目的,节点需要跟踪它的位置和它所代表的字符。

static class Node{

    int x;
    int y;
    char c;
    List<Node> adjecent = new ArrayList<>();

    public Node(int x, int y, char c){
        this.x = x;
        this.y = y;
        this.c = c;
    }

}

然后我们需要一种简单的方法来构建节点网格,表示我们的字符网格。我选择实现这一点,以便单个String对象可以表示整个网格,并且可以从该String构建网格。

public static Node[][] buildGraph(String s){
    String[] lns = s.split("\n");
    int M = lns.length;
    int N = lns[0].length();
    Node[][] out = new Node[M][N];
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            out[i][j] = new Node(i,j,lns[i].charAt(j));
            if(i != 0)
                out[i-1][j].adjecent.add(out[i][j]);
            if(j != 0)
                out[i][j-1].adjecent.add(out[i][j]);
        }
    }
    return out;
}

现在是实际的算法。它(正如评论所建议的那样)是基于BFS的。递归的入口点是下面的方法,它检查网格中可能用作有效起始位置的所有节点。

private static void buildWord(Node[][] mtx, String target){
    char c = target.charAt(0);
    for(int i=0;i<mtx.length;i++){
        for(int j=0;j<mtx.length;j++){
            if(mtx[i][j].c == c){
                List<Node> tmp = new ArrayList<>();
                tmp.add(mtx[i][j]);
                buildWord(mtx[i][j], target, tmp);
            }
        }
    }
}
private static void buildWord(Node start, String target, List<Node> path){
    if(path.size() > target.length()){
        return;
    } else if(path.size() == target.length()){
        String tmp = "";
        for(Node n : path)
            tmp += n.c;
        if(tmp.equals(target)){
            for(int i=0;i<path.size();i++)
                System.out.print("[" + path.get(i).x + ", " + path.get(i).y + "](" + path.get(i).c + ") --> ");
            System.out.print("\n");
        }
    } else {
        char nxtChar = target.charAt(path.size());
        for(Node n : start.adjecent){
            if(n.c == nxtChar){
                path.add(n);
                buildWord(n, target, path);
                path.remove(path.size() - 1);
            }
        }
    }
}
public static void main(String[] args){
    Node[][] matrix = buildGraph("abc\ndef\nghi");
    buildWord(matrix, "adeh");
}
[0, 0](a) --> [1, 0](d) --> [1, 1](e) --> [2, 1](h) --> 
 类似资料:
  • 我正在阅读一些面试准备材料,我想知道如果字符串或数组中的字符可以是unicode字符,那么解决这个问题的最佳方法是什么。如果它们是严格的ascii,则可以创建一个大小为256的数组,并将每个ascii字符映射到一个索引,该数组中的位置将表示出现的次数。如果字符串有unicode字符,是否仍然可以这样做,即unicode字符的大小是否合理,您可以使用整数数组的索引来表示它?由于unicode字符的大

  • 问题内容: 我正在寻找一种在字符串中查找JSON数据的方法。像wordpress简码一样思考它。我认为最好的方法是使用正则表达式。我不想解析JSON,只需查找所有出现的事件。 正则表达式中是否有办法使括号的数量匹配?目前,当我嵌套对象时遇到了这个问题。 演示的快速示例: 结果,我想要两个JSON字符串。谢谢! 问题答案: 从给定的文本中提取JSON字符串 由于您正在寻找一种简单的解决方案,因此可以

  • 我们用AngularJS HTML创建了一个应用程序。在这种情况下,文本框、链接、按钮和其他对象上的选项卡顺序应该是从左到右的。一旦到达行上最右边的对象,选项卡就应该向下移动到最左边的文本框。 为了实现这一点,我在元素上添加了tab-index,但根据需要,我需要从左到右移动。 下面添加了一个示例代码: 由于所设计的UI是列式设计,所以如果设计分为两部分,每部分有四个组合框,则添加为: DIV1

  • 我有超过15个字符串列表,每个列表包含几个不同的代码。每个列表包含一种特定类型的代码。我有一个输入代码,必须找出该输入代码属于哪个列表,并根据结果返回一个特定字符串。我用if,else if来做这个。下面是示例代码 每个列表如下所示:公共静态列表codeTypeOneList=新ArrayList(); (其他代码类型的类似列表) 有没有更好的方法来实现这一点?谢谢

  • 问题内容: 我有一个字符串序列-最多200万。它们不连续。意思是有差距。在0000003之后说下一个字符串可能是0000006。我需要找出所有这些间隙。在上述情况下(0000004、0000005)。 到目前为止,这是我所做的- 但是正如您可能已经猜到的那样,自从我使用以来,这很慢。如果我使用来预填充curr_ids,它将更快。但是填充哈希表的复杂性是什么?最快的方法是什么。 问题答案: 您可以对

  • 问题内容: 给我们一个字符串,说一个子字符串,说。我需要找到字符串在原始字符串中第二次出现时的索引。 在这种情况下将返回2。在这种情况下,我希望输出为10。 问题答案: 使用的重载版本,它将起始索引(fromIndex)作为第二个参数: