String 不使用内置函数的字符串匹配

String 不使用内置函数的字符串匹配,string,matlab,String,Matlab,我想在主题(另一个字符串)中搜索查询(一个字符串) 查询可以全部或部分显示,但不会重新排列。例如,如果查询是'da',而主题是'dura',则它仍然是匹配项 我不允许使用字符串函数,如strfind或find如果这是家庭作业,我建议您在查看实际代码之前先查看代码前面的解释,然后自己尝试 下面的代码查找主题字符串中出现的查询字符串的所有字符(变量m;以及相关的ii,jj)。然后测试这些事件的所有可能顺序(变量test)。如果订单在递增位置(cond2)包含所有所需字符(cond1),则订单是“可接

我想在主题(另一个字符串)中搜索查询(一个字符串)

查询可以全部或部分显示,但不会重新排列。例如,如果查询是
'da'
,而主题是
'dura'
,则它仍然是匹配项


我不允许使用字符串函数,如
strfind
find

如果这是家庭作业,我建议您在查看实际代码之前先查看代码前面的解释,然后自己尝试

下面的代码查找
主题
字符串中出现的
查询
字符串的所有字符(变量
m
;以及相关的
ii
jj
)。然后测试这些事件的所有可能顺序(变量
test
)。如果订单在递增位置(
cond2
)包含所有所需字符(
cond1
),则订单是“可接受的”。如果至少有一个可接受的顺序,则结果(变量<代码>结果)是肯定的

subject = 'this is a test string';
query = 'ten';

m = bsxfun(@eq, subject.', query);
%'// m: test if each char of query equals each char of subject
[ii jj] = find(m);
jj = jj.'; %'// ii: which char of query is found within subject...
ii = ii.'; %'// jj: ... and at which position
test = nchoosek(1:numel(jj),numel(query)).'; %'// test all possible orders
cond1 = all(jj(test) == repmat((1:numel(query)).',1,size(test,2)));
%'// cond1: for each order, are all chars of query found in subject?
cond2 = all(diff(ii(test))>0);
%//  cond2: for each order, are the found chars in increasing positions?
result = any(cond1 & cond2); %// final result: 1 or 0
对于
测试
,可以使用更好的方法来改进代码,即不测试
nchoosek
给出的所有可能订单

Matlab允许您查看内置函数的源代码,因此您可以随时尝试阅读代码,以了解Matlab开发人员是如何做到这一点的(尽管可能会非常复杂)。(感谢路易斯的更正)

在另一个字符串中查找字符串是一个基本的计算机科学问题。您可以在任意数量的资源中阅读它,例如

你对不重新排列部分匹配的要求让人想起了将剪接变体映射到基因组序列的生物信息学问题

你可以通过使用序列比对算法来解决你的问题,例如,修改为处理所有英文字符,而不仅仅是DNA碱基


这个问题真的来自生物信息学吗?如果是这样,您应该将其标记为这样。

约束使得使用单个循环实际上非常简单。假设您有两个索引最初指向两个字符串的第一个字符,现在比较它们-如果它们不匹配,增加主题索引,然后重试。如果是,则两者都递增。如果此时已到达查询的末尾,则已找到它。实际的实现应该足够简单,我不想为您做所有的工作;)

查看或。如果不能使用函数,即使是
regexp
,也可以逐字逐句检查输入字符串并与匹配字符串进行比较。除此之外,请显示您尝试过的代码!实际上,并非所有的Matlab函数都有可访问的源代码。确切地说,那些Matlab称为“内置”的函数不是用Matlab代码编写的(可能是出于速度原因)。如果您尝试
键入strfind
,它将只打印
“strfind”是一个内置函数
,因此没有可用的源代码。