Longest Palindromic Substring 最长回文子串
2015-10-12 04:40
495 查看
之前不知道为什么没太想明白,想明白了之后觉得其实还是挺容易的。大概记录一下思路。
其实就是简单的从两个相同的字符开始找起而已。
第一次找类似于"aa","bb"这样的结构。这里需要注意的就是当判断‘aa’的时候,‘aa’结构对应的是table[i+1][j-1]
举例来说,如果i为0,j为1,也就是table[1][0],当你的原始字串是类似于’aba‘的结构的时候,是不会有这样的问题的,aba的时候,判断table的值得时候会落在b上。而b是自己的回文。所以要提前赋值给table[i][i-1]。
然后接着判断有没有abba这样的结构,然后是abbccbba....就这么一个循环的过程。记录最长就好了。
在网上浏览的时候完全被大家画的矩阵搞晕了。是个矩阵,当你想明白之后看矩阵也会觉得很清晰。但是,我觉得阐述思路是更重要的。
比如
这里就是要把最下面那个0变成1
很容易看出最长子串在哪里了吧?(为了容易理解我没有加上特殊条件table[i][i-1] = 1)
其实就是简单的从两个相同的字符开始找起而已。
第一次找类似于"aa","bb"这样的结构。这里需要注意的就是当判断‘aa’的时候,‘aa’结构对应的是table[i+1][j-1]
举例来说,如果i为0,j为1,也就是table[1][0],当你的原始字串是类似于’aba‘的结构的时候,是不会有这样的问题的,aba的时候,判断table的值得时候会落在b上。而b是自己的回文。所以要提前赋值给table[i][i-1]。
然后接着判断有没有abba这样的结构,然后是abbccbba....就这么一个循环的过程。记录最长就好了。
在网上浏览的时候完全被大家画的矩阵搞晕了。是个矩阵,当你想明白之后看矩阵也会觉得很清晰。但是,我觉得阐述思路是更重要的。
比如
a | a | |
a | 1 | 1 |
a | 0 | 1 |
a | b | c | e | c | a | |
a | 1 | 0 | 0 | 0 | 0 | 0 |
b | 0 | 1 | 0 | 0 | 0 | 0 |
c | 0 | 0 | 1 | 0 | 0 | 0 |
e | 0 | 0 | 0 | 1 | 0 | 0 |
c | 0 | 0 | 1 | 0 | 1 | 0 |
a | 0 | 0 | 0 | 0 | 0 | 1 |
private static String findSub(String str) { // TODO Auto-generated method stub int length = str.length(); boolean table[][] = new boolean[length][length]; int start=0, end=0,longest = 0; table[0][0] = true; for(int i=1; i < length; i++) { table[i][i] = true; table[i][i-1] = true;//abba这样的substring需要 } for(int k = 2; k <= length; k++)//substring length { for(int i = 0; i <= length-k; i++) { int j = i+k-1; if(str.charAt(i)==str.charAt(j) && table[i+1][j-1] == true) { table[i][j]=true; if(longest < k) { longest = k; start = i; end = j+1; } } } } str = str.substring(start,end); return str; }
相关文章推荐
- 不可逆加密,数字签名,Java实现,摘要,MD5,SHA128,SHA256
- LeetCode:Longest Palindromic Substring
- 快速排序算法java代码实现
- 递归读取某个路径下的所有文件
- LeetCode-Longest Palindromic Substring
- Longest Palindromic Substring
- 最长回文子串
- RSA算法简介及简单java实现类
- poj_1159
- N皇后问题
- LeetCode--longest palindromic substring
- [LeetCode]Longest Palindromic Substring
- 选择排序,Java实现
- 冒泡排序,Java实现
- Runaway Robot游戏过关通用算法设计并java语言实现
- 游戏引擎理论与实现系列01-生成窗口
- Manacher算法-求字符串中最长回文串
- LeetCode:Reorder List C++与Java实现
- Valid Parentheses Java
- 数据结构Java实现——④数组——>稀疏矩阵十字链表存储法