【问题标题】:Matlab. Find the indices of a cell array of strings with characters all contained in a given string (without repetition)MATLAB。查找字符串元胞数组的索引,其中字符全部包含在给定字符串中(不重复)
【发布时间】:2013-10-13 08:44:15
【问题描述】:

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

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 指出。

【问题讨论】:

  • 'aac' 是否适合您? 'a'str 中出现两次?
  • 可以只做第3步,将dic中出现的字符从str中一一删除。我认为还有一些方法可以使用intersectsetxorismember 等...
  • 是的,'aac' 是有效的,因为 str 有两个 'a'。
  • 我尝试过使用ismember和intersect,但是一直没有找到解决办法。无论如何,第 3 步是一段相当慢的代码,除非有办法对其进行矢量化。
  • @P0W: 'zac' 有效(第 6 个元素); 'zaz' 无效(第 7 个元素)。

标签: string matlab find character cell-array


【解决方案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)));

【讨论】:

  • Mohsen,您的解决方案是我迄今为止尝试过的最好的解决方案:正确、优雅且速度惊人。起首!
【解决方案2】:

我想出了这个:

>> 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 : 最后对dic 中的每个元素使用 g 和 h

【讨论】:

  • 它很优雅并且可以正常工作。我只是想知道为什么它这么慢,只是比我的快一点。我的变量 dic 非常大,大约 60K 行 - 你认为我应该写一个 mex 文件吗?无论如何,P0W,你的代码回答了我的问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多