Matlab的。查找包含在给定字符串中的字符的字符串单元格数组的索引(不重复)

时间:2013-10-13 08:44:15

标签: string matlab find character cell-array

我有一个字符串和一个字符串数组。

str = 'actaz';
dic = {'aaccttzz', 'ac', 'zt', 'ctu', 'bdu', 'zac', 'zaz', 'aac'};

我想获得:

idx = [2, 3, 6, 8];

我写了一段非常长的代码:

  1. 查找长度不大于length(str)的元素;
  2. 删除不包含在str;
  3. 中的字符的元素
  4. 最后,对于每个剩余的元素,逐个检查字符
  5. 基本上,它是一个几乎强力的代码,运行速度非常慢。我想知道是否有一种简单的方法可以快速完成。

    注意:我刚刚编辑了这个问题,以明确如果字符在str中出现n次,则可以重复n次。谢谢Shai指出来。

2 个答案:

答案 0 :(得分:1)

我想出了这个:

>> g=@(x,y) sum(x==y) <= sum(str==y); 
>> h=@(t)sum(arrayfun(@(x)g(t,x),t))==length(t);
>> f=cellfun(@(x)h(x),dic);
>> find(f)

ans =

     2     3     6
  • g&amp; h:检查搜索字符串中每个字母的计数数量&lt; = str中的计数数量。
  • f:最后对dic
  • 中的每个元素使用g和h

答案 1 :(得分:1)

您可以对字符串进行排序,然后使用正则表达式匹配它们。对于您的示例,模式将为^a{0,2}c{0,1}t{0,1}z{0,1}$

u = unique(str);
t = ['^' sprintf('%c{0,%d}', [u; histc(str,u)]) '$']; 
s = cellfun(@sort, dic, 'uni', 0);
idx = find(~cellfun('isempty', regexp(s, t)));