如何查找不包含子串回文的所有字符串

时间:2015-05-21 18:29:36

标签: string algorithm probability combinatorics discrete-mathematics

免责声明:这是HackerRank提出的一个问题,但他们的编辑答案还不够,所以我希望得到更好的答案。如果违反任何政策,请告诉我,我会把它删除。

问题: 您将获得两个整数,N和M.计算大小为M的字母表集合中长度为N的字符串数,该字符集不包含长度大于1的任何回文字符串作为连续子字符串。

N = 2,M = 2 - > 2 :: AA, AB BA ,BB

N = 2,M = 3 - > 6 :: AA, AB AC BA ,BB, BC CA CB ,CC

ABCDE计数,因为它不包含任何回文子串。

ABCCC不计算它包含“CCC”,长度> 1的回文。

编辑 以下是我认为错误的答案:

对于N> = 3,有(M-2)种方法可以选择任何下一个符号(在前两个符号之后) - 基本上它不应与先前和前一个符号不一致,它们不相等。 / p>

If N=1, return M

If N=2, return M * (M-1)

If N>=3, return M * (M-1) * (M-2)^(N-2)

反例:N = 4,M = 3,“ABCC”

我的解决方案尝试 当我处理这个问题时,我试图找到所有包含回文子串的字符串并从总数中减去M ^ N.过度计数我遇到了很多问题。例如,“ABABA”具有n = 3的“ABA”,“BAB”,“ABA”和n = 5的“ABABA”。

感谢您解释此问题的任何帮助。我真的希望得到一个很好的答案来解决这个问题!

1 个答案:

答案 0 :(得分:2)

假设您一次一个字母地构建无回文字符串。对于第一个字母,您有M个选择,而对于第二个字母,您有M-1,因为您不能使用第一个字母。这很明显。

对于前两个字母之后的每个字母,你不能使用前一个字母,并且在此之前你不能使用这个字母,因此消除了两个选择。其他信件怎么样?好吧,如果使用其中一个产生回文,它必须是长度至少为4的回文 - 但如果添加一个字母会产生长度为K + 2的回文,对于K> = 2,该字符串必须已经有一个新的回文构建的长度为K的回文。 (对于K <2,这没关系。)由于字符串没有长度> = 2的任何回文,我们可以得出结论,添加除前两个字母之外的任何字母都可以。

因此,我们有第一个字母的M个选择,第二个字母的M-1选择,以及之后每个字母的M-2。