2

我有一个字符串和一个字符串单元格数组。

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

我想获得:

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

我写了一个很长的代码:

  1. 查找长度不大于 length(str) 的元素;
  2. 删除 str 中不包含字符的元素;
  3. 最后,对于每个剩余的元素,一个一个地检查字符

从本质上讲,它几乎是蛮力代码,运行速度非常慢。我想知道是否有一种简单的方法可以快速完成。

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

4

2 回答 2

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 & h:检查搜索字符串中每个字母的计数是否 <= 中的计数str
  • f :最后对中的每个元素使用 g 和 hdic
于 2013-10-13T09:58:06.770 回答
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)));
于 2013-10-13T15:32:50.640 回答