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

时间:2014-01-07 18:42:32

标签: string matlab

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

查询可能全部或部分显示,但不会重新排列。例如,如果查询为'da',且主题为'dura',则仍为匹配。

我不允许使用strfindfind等字符串函数。

3 个答案:

答案 0 :(得分:0)

如果这是作业,我建议你先查看代码前面的解释,然后自己尝试,然后再查看实际的代码。

以下代码查找query字符串中subject字符串中所有字符的出现(变量m;以及相关的iijj) 。然后它测试那些事件的所有可能顺序(变量test)。如果订单在增加的位置(cond1)中包含所有期望的字符(cond2),则该订单是“可接受的”。如果至少有一个可接受的订单,结果(变量result)是肯定的。

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

可以通过对test使用更好的方法来改进代码,即不测试nchoosek给出的所有可能的订单。

答案 1 :(得分:0)

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

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

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

您可以使用序列比对算法(例如Smith-Waterman)解决您的问题,修改后可以使用所有英文字符而不仅仅是DNA碱基。

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

答案 2 :(得分:0)

这些约束使得单个循环实际上非常简单。想象一下,你有两个索引最初指向两个字符串的第一个字符,现在比较它们 - 如果它们不匹配,增加主题索引并再试一次。如果他们这样做,增加两者。如果您已经到达查询的末尾,那么您已找到它。实际的实现应该足够简单,我不想为你做所有工作;)