[USACO] Calf Flac

 

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

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

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

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

 


 

 

 


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


这道题给了我很多教训:

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

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值