今天我这刷题,又刷到一个叫“NC17”的题,名字叫最长回文子串。听着挺玄乎,就是让找出一个字符串里最长的那个回文字符串。
啥叫回文?就是正着读反着读都一样的字符串,比如“aba”、“bab”这种。这题就是让算一下,给定的字符串里,最长的这种字符串有多长。
我一开始看这题,觉得还挺简单的嘛不就是找字符串么。我先试着把所有可能的字符串都列出来,然后再一个个看是不是回文,找最长的那个不就行。但我这代码一写,发现问题大,这方法太笨,如果字符串特别长,那得算到猴年马月去。
没办法,我就只好去网上查查,看看有没有什么好办法。这一查,还真让我找到一个叫“动态规划”的方法。这名字听着就挺高级的,我一开始也没看懂,后来琢磨半天,总算是明白点儿。
大概意思就是,咱可以用一个表格来记录每个子字符串是不是回文。这个表格,行和列就代表子字符串的开始和结束位置。如果一个子字符串是回文,那对应的格子里就填1,否则就填0。然后我们就可以根据这个表格来推导出更长的子字符串是不是回文。
举个例子,比如说咱要看“aba”是不是回文,那咱就先看“b”是不是回文,然后再看“a”是不是回文。如果“b”是回文,并且“a”和“a”相等,那“aba”就是回文。这样一来,我们就可以从短的子字符串开始,一步步推导出长的子字符串是不是回文,找到最长的那个。
我按照这个思路,重新写代码。这回就快多,一下子就算出结果。比如说输入“ababc”,程序就告诉我最长的回文子串长度是3,因为“aba”和“bab”都是回文,而且长度都是3。
还有个例子是“abc1234321ab”,程序算出来最长的回文子串长度是7,因为“1234321”是回文,长度是7。
这题还是挺有意思的,让我学到一个新的方法。虽然过程有点曲折,但做出来还是挺有成就感的。这让我想起来之前看的那个电影分级制度,NC17好像就是说17岁以下禁止观看,跟这题还挺巧的,哈哈。
- 第一次尝试: 把所有字符串都列出来,然后一个个验证,看是不是回文。
- 发现问题: 字符串一长,计算量就很大,此方法很笨重,需要优化。
- 网上学习: 查到一个叫动态规划的方法。
- 理解并实践: 使用表格来记录每个子字符串是不是回文,然后根据表格来推导出更长的子字符串是不是回文。
- 成功实现: 按照这个思路,重新写代码,一下子就计算出结果。
这回的实践分享就到这里,希望我的过程和结果能够给你带来一些帮助,记住:实践出真知。
还没有评论,来说两句吧...