[Leetcode] Longest Palindromic Substring
2015-11-27 14:23
363 查看
问题:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
假设 f(i, j) 表示字符串S中下标从i到j的子串是否为回文,其值为true或false,那么用如下的公式来递归计算所有i,j组合的f(i, j):
我们只考虑i <= j 的情形
如果i == j, 那么 f(i, j) 表示S中只包含一个字符的子串是否为回文,这个子串肯定是回文,因此 f(i, j) =
true;
如果i + 1 = j, 那么 f(i, j) 表示S中只包含前后相邻的两个字符的子串是否为回文,因此其值又这两个字符是否相等决定,
即 f(i, j) = S.charAt(i) == S.charAt(j).
如果i + 1 < j, 那么 f(i, j)
表示S中至少包含三个字符的子串是否为回文,这时如果i处的字符等于j处的,并且夹在它们之间的子串也是回文的话,那么该子串就也是回文,否则就不是。因此,
f(i, j) = S.charAt(i) == S.charAt(j) && f(i + 1, j -
1).
总结一下,
当i == j时,f(i, j) = true
当i + 1 = j时,f(i, j) = S.charAt(i) == S.charAt(j)
当i + 1 < j时,f(i, j) = S.charAt(i) == S.charAt(j) && f(i
+ 1, j - 1)
根据这个公式,计算所有f(i, j)并在计算过程中记录最长子串的长度和起始位置。
Java代码如下:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
假设 f(i, j) 表示字符串S中下标从i到j的子串是否为回文,其值为true或false,那么用如下的公式来递归计算所有i,j组合的f(i, j):
我们只考虑i <= j 的情形
如果i == j, 那么 f(i, j) 表示S中只包含一个字符的子串是否为回文,这个子串肯定是回文,因此 f(i, j) =
true;
如果i + 1 = j, 那么 f(i, j) 表示S中只包含前后相邻的两个字符的子串是否为回文,因此其值又这两个字符是否相等决定,
即 f(i, j) = S.charAt(i) == S.charAt(j).
如果i + 1 < j, 那么 f(i, j)
表示S中至少包含三个字符的子串是否为回文,这时如果i处的字符等于j处的,并且夹在它们之间的子串也是回文的话,那么该子串就也是回文,否则就不是。因此,
f(i, j) = S.charAt(i) == S.charAt(j) && f(i + 1, j -
1).
总结一下,
当i == j时,f(i, j) = true
当i + 1 = j时,f(i, j) = S.charAt(i) == S.charAt(j)
当i + 1 < j时,f(i, j) = S.charAt(i) == S.charAt(j) && f(i
+ 1, j - 1)
根据这个公式,计算所有f(i, j)并在计算过程中记录最长子串的长度和起始位置。
Java代码如下:
public class Solution { public String longestPalindrome(String s) { boolean[][] maxtrix = new boolean[s.length()][]; int start = 0, end = -1, longest = 0; for(int i = s.length() -1; i >= 0; i--) { maxtrix[i] = new boolean[s.length()]; for(int j = s.length() - 1; j >= i; j--) { if(j - i == 0) { maxtrix[i][j] = true; }else if(j - i == 1) { maxtrix[i][j] = s.charAt(i) == s.charAt(j); }else { maxtrix[i][j] = s.charAt(i) == s.charAt(j) && maxtrix[i + 1][j - 1]; } if(j - i + 1 > longest && maxtrix[i][j]) { longest = j - i + 1; start = i; end = j; } } } return s.substring(start, end + 1); } }
相关文章推荐
- C#数据结构之双向链表(DbLinkList)实例详解
- soapUI 环境管理
- 修改UISearchBar背景颜色
- 【xv6学习之Lec2】 PC hardware and x86 programming slides
- PTA数据结构与算法题目集(中文) 函数题 (1)
- 【非原创】PHPMywind调用
- 程序员面试题:问谁养蛇?
- Hbase 的基础操作
- 初学移动专题
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- NodeJs处理Get请求和Post请求
- 编写一个简单的SHELL脚本
- Some Notes of Python Interfaces Pycaffe (Caffe)
- 【南大软院大神养成计划:第十一天】JS,进阶的巨人(一)
- 第十二节 Flash的读写
- 关于android 5.0对开发带来的影响
- 初探 iOS8 中的 Size Class
- vs2008突然不能使用查找功能了(找不到要查找的文件 查找进行的过程中被停止)
- Android创建桌面快捷方式所遇到的问题与解决方案
- Hibernate对象的三种状态