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

String Matlab。查找所有字符都包含在给定字符串中的字符串单元格数组的索引(无重复),string,matlab,find,character,cell-array,String,Matlab,Find,Character,Cell Array,我有一个字符串和一个字符串单元格数组 str = 'actaz'; dic = {'aaccttzz', 'ac', 'zt', 'ctu', 'bdu', 'zac', 'zaz', 'aac'}; 我想获得: idx = [2, 3, 6, 8]; 我写了一段很长的代码: 查找长度不大于长度(str)的元素 删除str中不包含字符的元素 最后,对于每个剩余的元素,逐个检查字符 从本质上讲,它是一个近乎暴力的代码,运行速度非常慢。我想知道是否有一个简单的方法可以快速完成 注:我刚刚编辑了这

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

str = 'actaz';
dic = {'aaccttzz', 'ac', 'zt', 'ctu', 'bdu', 'zac', 'zaz', 'aac'};
我想获得:

idx = [2, 3, 6, 8];
我写了一段很长的代码:

  • 查找长度不大于长度(str)的元素
  • 删除str中不包含字符的元素
  • 最后,对于每个剩余的元素,逐个检查字符
  • 从本质上讲,它是一个近乎暴力的代码,运行速度非常慢。我想知道是否有一个简单的方法可以快速完成

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

    我提出了以下建议:

    >> 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=@(x,y)sum(x==y)>h=@(t)sum(arrayfun(@(x)g(t,x),t))==length(t);
    >>f=cellfun(@(x)h(x),dic);
    >>查找(f)
    ans=
    2     3     6
    

    • g&h:检查搜索字符串中每个字母的计数数是否可以对字符串进行排序,然后使用正则表达式进行匹配。例如,模式将是
      ^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)));
      

      'aac'
      是否适合您<代码>'a'在
      str
      中出现两次?您只能执行步骤3。并从
      str
      中逐个删除出现在
      dic
      中的字符。我认为还有一些方法可以使用
      intersect
      setxor
      ismember
      ,等等……是的,'aac'是有效的,因为str有两个'a'。我曾尝试使用ismember和intersect,但我还没有找到解决方案。无论如何,第3步是一段相当慢的代码,除非有办法将其矢量化。@P0W:'zac'是有效的(第6个元素);'“zaz”无效(第7个元素)。它很优雅,工作正常。我只是想知道为什么它这么慢,只是比我的要快一点。我的变量dic非常大,大约6万行-你认为我应该写一个mex文件吗?不管怎样,P0W,你的密码回答了我的问题。非常感谢你。莫森,你的解决方案是我迄今为止尝试过的最好的:正确、优雅、惊人的快速。起首部分!