0

我正在尝试在 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任何大小并且它能够处理它?

4

2 回答 2

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

显然 '_' 应该被删除,并且输出的格式是你想要的。

于 2013-10-12T21:15:57.240 回答
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:删除空格的字符串元胞数组,如您指定的那样
于 2013-10-13T01:46:10.767 回答