String 返回字符串的所有子序列

String 返回字符串的所有子序列,string,matlab,String,Matlab,我试图在Matlab中编写伪代码和算法,以返回字符串的所有子序列 因此字符串X={ABCD}将返回XSubSequence={A,B,C,D,AB,AC,AD,BC,BD,CD,ABC,ABD,ABC},顺序当然不重要 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:XSiz

我试图在Matlab中编写伪代码和算法,以返回字符串的所有子序列

因此字符串
X={ABCD}
将返回
XSubSequence={A,B,C,D,AB,AC,AD,BC,BD,CD,ABC,ABD,ABC}
,顺序当然不重要

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>代码>任何大小,它都能处理它?

你可能想考虑一个完全不同的方法。 这是长度为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

显然,应该删除“u”,并按照您希望的方式格式化输出。

这样做就可以了。它只有一个循环(没有嵌套),所以应该非常快

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
    :字符矩阵,其中每行包含一个子序列,并填充空格
  • <>代码>子SEQQueDeBurkD/<代码>:删除空白空间的字符串单元数组,如您指定的
如果您正在尝试……您尝试了什么?我们可以帮助您纠正方法或提出改进建议;像这样简单的问题,直接从你的作业中看出来。@Simon和@kiddorails是的,我一直在尝试,每次我都会被循环的布局绊倒。也有点尴尬,因为代码没有做任何我想做的事情,我喝酒是为了可以责备那件事,只是出于练习。上面的一些代码addedI已经添加了,这将在另一部分中有所帮助,但对我当前的需求没有帮助,但再次感谢您!很好,我会读更多的内容,我想知道我是否可以输入不同大小的x,而不是固定的4。但我可以看出那将是多么的快@Levz是的,您可以使用任意大小。但是有一个错误:最后一个
4
应该是
n
。我已经更正了我的答案。请现在试一试