【高中数学/排列组合】由字母AB构成的一个6位的序列,含有连续子序列ABA的序列有多少个?

【高中数学/排列组合】由字母AB构成的一个6位的序列,含有连续子序列ABA的序列有多少个?

【问题】

由字母AB构成的一个6位的序列,含有连续子序列ABA的序列有多少个

【答案】

27个,具体如下:

1.BBBABA 2.BBABAB 3.BBABAA 4.BBAABA 5.BABABB 6.BABABA 7.BABAAB 8.BABAAA 9.BAABAB 10.BAABAA 11.BAAABA 12.ABBABA 13.ABABBB 14.ABABBA 15.ABABAB 16.ABABAA 17.ABAABB 18.ABAABA 19.ABAAAB 20.ABAAAA 21.AABABB 22.AABABA 23.AABAAB 24.AABAAA 25.AAABAB 26.AAABAA 27.AAAABA

【解答】

这个问题先考虑总数,六个位置,每个位置两种选择,总共是2的6次方共64种选择;

这六十四种里,以ABA***为模式的有8种,*ABA**为模式的也有8种,**ABA*为模式的也有8种,***ABA为模式的还有8种,故总数不超过4*8=32种;

这三十二种里存在重复,如ABAABA可以出现在ABA***模式中,也可以出现在***ABA模式中,故总数小于31种;

如何再清除重复,我目前想到的办法是:把0~63的数字用二进制方式写出来,以1为A,以0为B,然后查看101出现的次数,下了一番笨功夫后,发现是27种。

为确保无误,我特地用程序跑了一遍,发现确实是27种!用Java编制的程序如下:

【程序】

package test260101; import java.util.Set; import java.util.TreeSet; /** * 由字母AB构成的一个6位的序列,含有连续子序列ABA的序列有多少个? * @author 逆火 * */ public class Test { public static void main(String[] args) { Set<String> set = new TreeSet<>();// 用于清除重复 for(int i=0;i<64;i++) {// 六位,每位两种选择,共64种 String binaryString = Integer.toBinaryString(i);// 0~63转二进制数 int n=6-binaryString.length();// 不足六位前补零 for(int j=0;j<n;j++) { binaryString="0"+binaryString; } if(binaryString.contains("101")) {// 含有101即ABA的放入集合 set.add(binaryString); } } int sn=0; for(String str:set) { str=str.replace("1", "A");// 以A替1 str=str.replace("0", "B");// 以B替0 System.out.println((++sn)+"."+str);// 输出序号及序列 } } }

【程序输出】

1.BBBABA 2.BBABAB 3.BBABAA 4.BBAABA 5.BABABB 6.BABABA 7.BABAAB 8.BABAAA 9.BAABAB 10.BAABAA 11.BAAABA 12.ABBABA 13.ABABBB 14.ABABBA 15.ABABAB 16.ABABAA 17.ABAABB 18.ABAABA 19.ABAAAB 20.ABAAAA 21.AABABB 22.AABABA 23.AABAAB 24.AABAAA 25.AAABAB 26.AAABAA 27.AAAABA

【点评】

没找到好办法,硬列举发现是27种,但作业帮扫出来说是18种,不放心又来了一遍发现还是27种;

最后用程序跑出来发现确实是27种,请问作业帮对此怎么说?!

END