我需要从MATLAB中的字符数组生成所有可能的子集,以减少执行时间。 例如: 输入='ABCA'; 输出='A', 'B', 'C', 'AB', '公元前', 'CA', “ ABC”, 'BCA', “ ABCA”
答案 0 :(得分:1)
您可以使用直接循环找到所有这些子集。我不知道这些向量化是否值得,因为任何向量化都需要大的中间数组。
随机输入500个字符,并在20时输入maxLen
,我得到了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'