免责声明:这是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”。
感谢您解释此问题的任何帮助。我真的希望得到一个很好的答案来解决这个问题!
答案 0 :(得分:2)
假设您一次一个字母地构建无回文字符串。对于第一个字母,您有M个选择,而对于第二个字母,您有M-1,因为您不能使用第一个字母。这很明显。
对于前两个字母之后的每个字母,你不能使用前一个字母,并且在此之前你不能使用这个字母,因此消除了两个选择。其他信件怎么样?好吧,如果使用其中一个产生回文,它必须是长度至少为4的回文 - 但如果添加一个字母会产生长度为K + 2的回文,对于K> = 2,该字符串必须已经有一个新的回文构建的长度为K的回文。 (对于K <2,这没关系。)由于字符串没有长度> = 2的任何回文,我们可以得出结论,添加除前两个字母之外的任何字母都可以。
因此,我们有第一个字母的M个选择,第二个字母的M-1选择,以及之后每个字母的M-2。