社区首页 >问答首页 >查找是否可以从字符矩阵中获取字符串。

查找是否可以从字符矩阵中获取字符串。
EN

Stack Overflow用户
提问于 2014-06-02 18:34:05
回答 3查看 2.1K关注 0票数 3

给定一个字符矩阵和一个字符串,查找是否可以从该矩阵中获得该字符串。从矩阵中的每个字符,我们可以向上/向下/右/左移动。例如,如果matrix3是:

代码语言:javascript
代码运行次数:0
复制
o f a s
l l q w
z o w k 

字符串是follow,那么函数应该返回true。

我能想到的唯一方法是一个回溯算法,它可以搜索单词是否可能。还有其他更快的算法来解决这个问题吗?

假设我有很多疑问(关于找出一个单词是否存在)。那么,是否可以进行一些预处理,以更快地回答查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-02 22:06:23

您可以使用DFS解决这个问题。让我们为这个问题定义一个图。图的顶点将包括矩阵的一个单元格组合的单元格和我们正在搜索的字符串的前缀长度。当我们处于给定的顶点时,这将意味着到目前为止,指定前缀的所有字符都匹配,并且我们目前处于给定的单元格中。

我们将边定义为相邻的连接单元并执行“有效”事务。这就是我们要搜索的字符串中的下一个单元格。

为了解决这个问题,我们从包含字符串的第一个字母和前缀长度1的所有单元格中执行DFS (这意味着我们已经匹配了这个第一个字母)。从那里开始,我们继续搜索,在每个步骤上,我们计算出从当前位置出去的边(单元格/字符串前缀长度组合)。我们第一次到达长度为L的前缀时终止--字符串的长度。

请注意,DFS可能被认为是回溯,但更重要的是跟踪我们已经访问过的图中的节点。因此,总体复杂性受N * M * L约束,其中NM是矩阵的维数,L是字符串的长度。

票数 2
EN

Stack Overflow用户

发布于 2014-06-04 01:23:00

当然,您可以找到所有可能的字符串(从字符开始,并尽可能深入)。这可以通过递归函数来完成。

网格:

代码语言:javascript
代码运行次数:0
复制
abc
def
ghi

字符串:

代码语言:javascript
代码运行次数:0
复制
abcfedghi
abcfehgd
abcfehi
abedghif
abefc
abefighd
abehgd
abehifc
ad...
...

然后对这些字符串进行排序,在查找单词时,在列表上使用二进制搜索。(在查找n个字母单词时,当然只考虑列表中字符串的前n个字母。)大量的准备和大量的内存需要,但搜索将很快。因此,如果您一次又一次地使用相同的网格,准备工作最终可能会支付:-)

票数 1
EN

Stack Overflow用户

发布于 2016-01-19 23:48:17

下面是用于查找给定字符串是否存在于给定矩阵中的伪代码。这里访问了跟踪字符串在矩阵中的位置,它使用回溯来跟踪这个字符串。我希望这是有帮助的。

代码语言:javascript
代码运行次数:0
复制
bool isSafe(matrix[n][m], int visited[n][m], int i, int j, int n, int m){

if(i<m && j<n && i>=0 && j>=0 && visited[i][j] == 0)
    return true;
return false;
}

bool dfs(char matrix[n][m], int i, int j, int visited[n][m], char str[], int index){

if(index == strlen(str))
    return true;

// row moves
int x[] = {-1, 0, 1, -1};
// col moves
int y[] = {0, -1, 1, 0};

if(str[index] == matrix[i][j]){
    visited[i][j] = 1;
    // for all the neighbours
    for(int k = 0; k<4; k++){
        // mark given position visited
        next_x = i + x[k];
        next_y = j + y[k];

        if(isSafe(matrix, visited, next_x, next_y, n, m)){
            if(dfs(matrix, next_x, next_y, visited, str, index+1) == true)
                return true;
        }
    }
    // backtrack
    visited[i][j] = 0;

}

return false;

}

bool isPresent(char matrix[n][m], char str[]){

// visited initialized to 0
int visited[n][m] = {0};

for(int i=0;i<n;i++)
    for(int j=0;j<n;j++){
        if(dfs(matrix, i, j, n, m ,visited, str, 0) == true)
            return true;
    }


return false;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24006249

复制
相关文章
Kali远程桌面Windows时出现"连接被对端重置"错误
ERROR: rdp.c:140: rdp_recv(), unexpected stream overrun0000 03 00 00 1e 02 f0 80 68 00 01 03 eb 70 10 08 00 .......h....p... 0010 02 03 83 89 43 9f f8 48 33 7e 04 00 16 00 ....C..H3~....
菜菜有点菜
2022/03/16
2.9K0
Kali远程桌面Windows时出现"连接被对端重置"错误
如何重置MySQL或MariaDB Root密码
忘记密码发生在我们大多数人身上。如果您忘记或丢失了MySQL或MariaDB数据库的root密码,如果您有权访问服务器和启用了sudo用户帐户,您仍然可以获得访问权限并重置密码。
黑色技术
2018/10/19
5.5K1
记录神奇的DedeCMS管理员登录密码错误及重置问题
老蒋刚才准备将一个客户的企业网站(采用DedeCMS系统搭建)上线的。因为我们是采用本地主题前端模式,内核的程序一般还是要安装最新的。于是我在真实服务器环境中常规的安装织梦程序的时候没有问题,但是在设置账户密码之后,居然无法登录。
老蒋
2021/12/27
1.9K0
WordPress 如何重置密码
在本文中,我们将讨论两种在您忘记 WordPress 网站密码时让您重新登录 WordPress 网站的方法。
海拥
2022/10/06
3K0
WordPress 如何重置密码
Xmarks不能同步或连接被重置解决方案(修改hosts)
此操作只用来解决firefox插件Xmarks不能同步或连接被重置的问题,通过以下方法可以解决无法访问Xmarks问题。
zhaoJian.Net
2023/02/24
7120
linux mysql重置密码_linux系统重置
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE稳定放心使用
全栈程序员站长
2022/11/04
6.2K0
Ubuntu Linux下解决Xmarks不能同步或连接被重置方法
#xmarks 64.147.188.86 www.xmarks.com 64.147.188.92 api.xmarks.com 64.147.188.89 login.xmarks.com 64.147.188.87 sync.xmarks.com 64.147.188.86 static.xmarks.com 64.147.188.86 download.xmarks.com 64.147.188.86 my.xmarks.com 保存后,打开xmarks设置菜单,选择“高级”,加密那个下拉框里面选择“全部加密”,就可以同步了。
zhaoJian.Net
2023/02/24
1.2K0
如何在MySQL 8.0中重置Root密码
在遗忘或丢失MySQL root密码的不幸事件中,您肯定需要一种方法来恢复或重置MySQL 8.0版本中的root密码。
用户2323866
2021/06/18
13.4K0
Nginx怎样隐藏上游错误
当上游出错时,作为负载均衡的Nginx可以实时更换Server,在客户端无感知的情况下重新转发HTTP请求。这一功能在Nginx指令中称为next upstream,本文将详细介绍其用法及实现原理。
陶辉
2023/10/18
4690
Nginx怎样隐藏上游错误
当 kube-proxy 遇到连接重置
最近我一直被一个间歇性连接重置的 bug 所困扰,经过一段时间的调试之后,发现该 bug 是由几个不同的网络子系统联合导致的。通过这几天的深入挖掘和调试,我对 Kubernetes 的网络机制更加熟悉了,对此也有了一些经验总结,分享给社区。
米开朗基杨
2019/08/29
2.4K0
当 kube-proxy 遇到连接重置
如何重置MySQL root密码
在这篇文章中,我们将向您展示如何重置MySQL root密码以备忘记。 以下步骤适用于任何现代Linux发行版。
星哥玩云
2022/08/16
3.8K0
如何重置MySQL root密码
如何在MySQL 8中重置root密码
MySQL中的用户密码存储在用户表中,密码重置实际上是改变该表中记录的值。 要在忘记密码的情况下更改密码,我们的想法是绕过MySQL的身份验证进入系统并使用SQL命令更新记录密码值。
星哥玩云
2022/08/17
1.3K0
【说站】php数组中如何重置索引
1、array_values 函数并不止重置数字索引还会将字符串键名也同样删除并重置。
很酷的站长
2022/11/23
1.6K0
【说站】php数组中如何重置索引
如何在Ubuntu 18.04上重置MySQL或MariaDB Root密码
忘记密码发生在我们最好的人身上。如果您忘记或丢失了MySQL或MariaDB数据库的root密码,如果您有权访问服务器和具有sudo权限的用户帐户,您仍然可以获得访问权限并重置密码。
你在哪里
2018/10/30
3.5K0
重置密码
当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能。在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法。 发送邮件设置 Django 内置了非常方便的发送邮件的功能,不过需要在 settings.py 中做一些简单配置。生产环境下通常需要使用真实的邮件发送服务器,配置步骤会比较多一点。不过 Django 为开发环境下发送邮件提供了一些方便的 Backends 来模拟真实邮件的发送,例如直接发送邮件到终端()。在 sett
追梦人物
2018/04/17
4.9K0
重置密码
点击加载更多

相似问题

如何诊断/修复特使代理“上游连接错误或头前断开/重置。重置原因:连接失败”

12

Istio Ingress使用ACM:上游连接错误或头前断开/重置。重置原因:连接终止

11

Google运行上的GRPC :上游连接错误或头前断开/重置。重置原因:远程重置

16

特使:“上游连接错误或头部前断开/重置,重置原因:连接失败”

1419

Istio 1.3服务之间随机的“上游连接错误或头前断开/重置”

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文