返回String的所有子序列

时间:2013-10-12 18:45:07

标签: string matlab

我正在尝试在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,它能够处理它吗?

2 个答案:

答案 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:删除空格的字符串数组,如您指定的那样