分享一关于串匹配的有趣的题目
这道题我在leetcode和PTA 的Advanced Level Practice都见过,是一个有关回文串的题目,觉得有意思,和大家分享一下。
下面是题目
然后是陈越陈姥姥用C给出的standard answer
#include <stdio.h> #include <string.h> #define MAX 1003 char str[MAX]; int main() { gets(str); int length = strlen(str); int cnt1=0; int cnt2=0; int i,j; int tmp; for(i=0;i<length;i++){ for(j=0;i-j>=0&&j+i<length;j++){ if(str[i-j] != str[i+j]) break; else{ tmp =2*j+1; if(cnt1 < tmp) cnt1 = tmp; } } for(j=0;i-j>=0&&i+1+j<length;j++){ if(str[i-j] != str[i+j+1]) break; else{ tmp = 2*j+2; if(cnt2 <tmp) cnt2 = tmp; } } } if(cnt1 <cnt2) cnt1 =cnt2; printf("%d\n",cnt1); return 0; }
这个答案非常快。。。。。。运行速度如下。。。。。
下面是用Python的一个解决方法。。
思路是用二维数组计算从i到j的子串是不是回文串,具体见下代码:
def main(): l = input() n = len(l) flag = [ [1 for x in range(n)] for x in range(n)] maxs = 0 for x in range(1,n+1): for i in range(n-x): if l[i] == l[i+x] and flag[i+1][i+x-1] == 1: if x > maxs: maxs = x else: flag[i][i+x] = 0 print(maxs+1) if __name__ == "__main__": main()
显然代码少了好多,然而。。。。。。。。运行速度。。。。。
-----------------------------END---------------------------------------