String 词搜索算法matlab
我正在寻找一个有效的单词搜索算法。如果你能帮我想出来,那就更好了String 词搜索算法matlab,string,algorithm,matlab,word,String,Algorithm,Matlab,Word,我正在寻找一个有效的单词搜索算法。如果你能帮我想出来,那就更好了 a h c k x r j i b v t l c y q s 我想找到“艺术”。如果‘stra’也是一个有效的词,我希望也能找到它。(垂直、水平、对角和反向)。我提出了一些算法,但它们似乎效率不高,而且需要花费很长的代码。第一个包括使用find()获取第一个字母并查看该列或行 这里有一种方法: %// Example word grid C = [ 'a' 'h' 'c' 'k' 'r' 'x' 'r' 'j
a h c k
x r j i
b v t l
c y q s
我想找到“艺术”。如果‘stra’也是一个有效的词,我希望也能找到它。(垂直、水平、对角和反向)。我提出了一些算法,但它们似乎效率不高,而且需要花费很长的代码。第一个包括使用find()获取第一个字母并查看该列或行 这里有一种方法:
%// Example word grid
C = [
'a' 'h' 'c' 'k' 'r'
'x' 'r' 'j' 'i' 'p'
'b' 'v' 't' 'l' 'q'
'a' 'y' 'q' 's' 'o'];
%// Your search term
target = 'arts';
%// Optionally, do some obvious checks here.
%// - length of the search string may exceeds the grid's dimensions
%// - there are no matches for the first letter
%// - and similar
%// Form single cellstring containing all search directions
allDirections = [
%{
// horizontal, horizontal-reversed
%}
cellstr([C ; C(:,end:-1:1)])
%{
// vertical, vertical-reversed
%}
cellstr([C'; C(:,end:-1:1)'])
%{
// Diagonal, top-left to bottom-right, and reversed
%}
arrayfun(@(ii){diag(C,ii)'}, -size(C,1)+2:size(C,2)-2)';
arrayfun(@(ii){diag(C(end:-1:1,end:-1:1),ii)'}, -size(C,1)+2:size(C,2)-2)';
%{
// Diagonal, top-right to bottom-left, and reversed
%}
arrayfun(@(ii){diag(C(:,end:-1:1),ii)'}, -size(C,1)+2:size(C,2)-2)';
arrayfun(@(ii){diag(C(end:-1:1,:),ii)'}, -size(C,1)+2:size(C,2)-2)';
];
%// And now just find the string
strfind(allDirections , target)
当然,你可以通过以下方法来提高(记忆)效率
- 在所有方向上分别执行
strfind
- 在同一方向上执行2×
,但将strfind
倒置目标
- 等等
- 查找所有出现的第一个字母
- 根据网格的尺寸,消除所有不能满足
目标长度的引用
- 搜索所有命中的邻域以查找第二个字母
- 消除基于长度等的引用
试试看。轮廓学习。微笑。纠正我:)展示你迄今为止所做的尝试。这是一项大学作业,对吗?你的两位同事以前来过这里。先读,然后读,最后读。如果你还有问题,告诉我们你到底在哪里被卡住了。我不会被水平或垂直搜索卡住。正如我在问题示例中所说的那样,我被困在对角线上。我想知道我是否必须提取整个对角线并使用strfind,或者有没有更有效的方法。首先展示一下你拥有的那几个算法以及它们花费了多少时间,否则很难指出改进的地方。请记住,只有(N+M-1)*2条对角线需要在两个方向上进行计算。我无法想象它们有那么难提取。可能是尼斯方法的复制品!但是很难说这个词在最初的矩阵中是从哪里开始的,不是吗?据我所知,从类似的问题来看,一个词可能会出现好几次。而且,当你把所有的东西连接起来时,如果在两行上有一个“无效”字,会发生什么,比如:C=[ar;ts];它将被您的算法检测到,但不正确。我说得对吗?@thewaywewalk:(a)这是真的,尽管很容易推断出命中的位置,因为你知道
所有方向中的哪个行与哪个行/列/方向相对应。(b) 不,我连接的是整行字符,而不是单个字符。只需打印allDirections
即可了解我的意思。该单元格中的每个条目都是符合OP规则的有效字符串。