我正在尝试在Matlab中编写伪代码和算法,以返回字符串的所有子序列。
因此字符串X = {ABCD}
将返回XSubSequence = {A, B, C, D, AB, AC, AD, BC, BD, CD, ABC, ABD, BCD, ABCD}
,顺序无关紧要。
clear
x = 'ABC';
XSize = length(x);
count = 1;
i=1;
for i=1:XSize
ZSubSequence{count} = x(i);
count = count + 1;
for j=i+1:XSize
temp = strcat(x(i),x(j));
ZSubSequence{count} = temp;
count = count + 1;
for k=i+2:XSize
if j ~= k
temp = strcat(x(i), x(j), x(k));
ZSubSequence{count} = temp;
count = count + 1;
end
end
end
end
有没有什么方法可以让它变得更有活力,所以我可以添加任意大小的X
,它能够处理它吗?
答案 0 :(得分:1)
您可能想要考虑一种完全不同的方法。 这是从1到2 ^ length(x)-1的十进制数的二进制表示。您的示例的含义1100 = 12将是AB,0011 = 3将是CD,1000将是A,1111 = 2 ^ 4-1 = 15将是ABCD,依此类推。 您可能想要创建此序列,然后将其转换为您拥有的输入输出。
示例代码:
x = 'ABCD';
XSize = length(x);
seq=dec2bin([1:2^XSize-1]);
现在所有人都离开了将其翻译成字母
for i=1:1:2^XSize-1
for j=1:1:XSize
if seq(i,j)=='1'
seq(i,j)=x(j);
else
seq(i,j)='_';
end
end
end
显然应删除'_'并按照您希望的方式格式化输出。
答案 1 :(得分:0)
这应该这样做。它只有一个循环(没有嵌套),所以它应该很快。
x = 'ABCD';
n = length(x);
subseq = x.';
for ii = 2:n
subseq = strvcat(subseq, x(nchoosek(1:n,ii)));
end
subseq_deblanked = deblank(mat2cell(subseq, ones(size(subseq,1),1), n));
结果是:
subseq
:char矩阵,其中每行包含一个用空格填充的子序列。subseq_deblanked
:删除空格的字符串数组,如您指定的那样