首页 > 解决方案 > 从 MATLAB 中的字符数组生成所有可能的子集

问题描述

我需要从 MATLAB 中的字符数组生成所有可能的子集,并减少执行时间。例如:输入='ABCA'; 输出='A','B','C','AB','BC','CA','ABC','BCA','ABCA'

标签: matlab

解决方案


您可以使用直接循环找到所有这些子集。我不知道向量化这些是否值得,因为任何向量化都需要大型中间数组。

随机输入 500 个字符,maxLen在 20 个字符时,我得到了 4207817 个唯一的子字符串。我的电脑(使用 MATLAB R2017a)花了 12 秒才找到这些。这是否足够快取决于您,但我不会费心进一步优化它。

input = 'ABCA';
maxLen = 4;

subsets = {};
for len = 1:maxLen
   subs = cell(1,numel(input)-len+1);
   for start = 1:numel(subs)
      subs{start} = input(start:start+len-1);
   end
   subs = unique(subs);
   subsets = [subsets,subs];
end
disp(subsets)

输出:

'A'    'B'    'C'    'AB'    'BC'    'CA'    'ABC'    'BCA'    'ABCA'

如果保留子字符串的顺序很重要,则将'stable'参数添加到unique调用中:

   subs = unique(subs,'stable');

例如,对于input = 'AFCB';,没有的输出'stable'是:

'A'    'B'    'C'    'F'    'AF'    'CB'    'FC'    'AFC'    'FCB'    'AFCB'

'stable'是:

'A'    'F'    'C'    'B'    'AF'    'FC'    'CB'    'AFC'    'FCB'    'AFCB'

推荐阅读