[USACO] Calf Flac

来源:互联网 发布:电脑如何移动软件 编辑:程序博客网 时间:2024/06/13 13:43

 

最初的想法:让i指向字符串的首端,j指向末端,然后对每一个i,j逐渐递减,然后对每一个递减的j,判断i到j这段字符串是否回文。这个白痴的想法最坏需要O(n3)的时间,虽然可以通过局部的优化,提前结束i,j的遍历以及回文的判断,可是对于第八个测试数据死活也过不了,时间超了不止一点两点,本机上跑用了4秒多,我擦嘞!

上网搜索了一下提示,我的想法是从两边向中心靠拢,其实还可以从中心向两边延伸,这样只要遍历每个中心点,对每个中心点进行双向的搜索,时间复杂度就降为O(n2),可以接受了。遍历时注意分两种情况,abba和abcba的对称位置是不同的。。。

实际编码时,明显感觉比原来的想法实现起来容易很多,少一层循环边界条件就少一些,出错几率就小一些,最后连TE再加上WA一共提交了7次,花了一天时间,你妹的!

网上还有一种方法是把输入串翻转,然后求最长公共子串,这个没有具体细看,回头再说。。。

 


 

 

 


分析的解法基本思路与我的是一样的,不过实现上略有不同,它把输入串保存在两个数组中,一个是原始数组,一个是去掉标点空白的纯文本数组,然后利用后一个数组找最长回文串的长度,最后再在原始数组中输出整个的回文串。。。


这道题给了我很多教训:

一,不要过度依赖测试用例,要自己把所有可能的情况尽量想到,每次提交都被打回来的滋味相当不好受,严重打击积极性。。。

二,构造算法时一定要想到极限情况,并设计可以经受住考验的算法,时间复杂度太高可不是一件小事!!

三,拓宽思路,自己多想想,不要一遇到问题就找Google,这么急赶着投胎啊?!

 

原创粉丝点击