Palindrome Subarrays

给定输入字符串,要求判断任意子字符串是否对称。

基本思路就是DP

写出DP表达式为 dp[i][j] = dp[i + 1][j - 1] && (s[i] == s[j])    dp[i][j]代表s(i,j)的子串是否对称

注意在for循环赋值时,这里增长的对象其实是子串的长度。

长度为奇数时:

(->代表决定)

dp[0,0]

dp[1,1] -> dp[0,2]

dp[2,2] -> dp[1,3] -> dp[0,4]

dp[3,3] -> dp[2,4] -> dp[1, 5]

...

长度为偶数时:

dp[0,1]

dp[1,2] -> dp[0,3]

dp[2,3] -> dp[1,4] -> dp[0,5]

dp[3,4] -> dp[2,5] -> dp[1,6]

...

因此外层循环变量是长度,内层循环变量是起点

 1 def palindrom(s):
 2     length = len(s)
 3     # Create a 2D array in Python
 4     dp = [[False for i in range(length)] for j in range(length)]
 5     # length = 1 substring
 6     for i in range(length):
 7         dp[i][i] = True
 8     # length = 2 substring
 9     for i in range(length - 1):
10         if s[i] == s[i + 1]:
11             dp[i][i + 1] = True
12     # length = k substring
13     for len3 in range(3, length + 1):
14         for start in range(0, length - len3 + 1):
15             end = start + len3 - 1
16             if s[start] == s[end] and dp[start + 1][end - 1]:
17                 dp[start][end] = True
18 
19     print dp
20     print dp[0][length - 1]
21 
22 palindrom('aaaaabbb')

 

posted @ 2015-11-03 11:02  树獭君  阅读(273)  评论(0编辑  收藏  举报