leetcode:5. Longest Palindromic Substring
来源:互联网 发布:杭州淘宝拍摄公司 编辑:程序博客网 时间:2024/06/17 15:53
一、问题描述
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Example:Input: "babad"Output: "bab"Note: "aba" is also a valid answer.Example:Input: "cbbd"Output: "bb"
二、思路
- 思路一:暴力,判断每个字符串是不是回文串,若是回文串,若该串是目前最长的回文串,则更新最长长度与记录该回文串开始和结束的位置。具体代码看下面
- 思路二:一个长的回文串包含子回文串,暴力求解过程中重复去判断子回文串,导致了效率低下。一个好的方式,是从中心开始向外拓展回文串。具体代码看下面
- 思路三:使用Manacher算法,具体可以看以下两篇文章
- Manacher’s ALGORITHM: O(n)时间求字符串的最长回文子串
- 最长回文子串——Manacher 算法
三、代码
- 思路一代码:
public class Solution { public String longestPalindrome(String s) { int longest_length = 0; int begin = 0; int end = 0; int len = s.length(); for (int i = 0; i < len; i++){ for (int j = i; j < len; j++){ //更新最长回文串长度并记录开始和结束的位置 if (isPalindrome(s.substring(i, j + 1)) && (j - i + 1 ) > longest_length){ begin = i; end = j + 1; longest_length = j - i + 1; } } } return s.substring(begin, end); } //判断是不是回文串 private static boolean isPalindrome(String s){ for (int i = 0; i < s.length() / 2; i++){ if (s.charAt(i) != s.charAt(s.length() - i - 1)){ return false; } } return true; }}
- 思路二代码:
public class Solution { public String longestPalindrome(String s) { int i, j; int begin = 0; int end = 0; int max_len = 0; int cur_len = 0; int s_len = s.length(); for (i = 0; i < s_len; i++){ // the middle point of palindrome for (j = 0; (i - j >= 0) && (i + j < s_len); j++){ // if the length of palindrome is odd if (s.charAt(i - j) != s.charAt(i + j)){ break; } cur_len = j * 2 + 1; } if (cur_len > max_len){ max_len = cur_len; begin = i - j + 1; end = i + j; } for (j = 0; (i - j >= 0) && (i + j + 1 < s_len); j++){ // if the length of palindrome is even if (s.charAt(i - j) != s.charAt(i + j + 1)){ break; } cur_len = j * 2 + 2; } if (cur_len > max_len){ max_len = cur_len; begin = i - j + 1; end = i + j + 1; } } return s.substring(begin, end); }}
- 思路三代码:
public class Solution { public String longestPalindrome(String s) { s = formatString(s); int[] radius = new int[s.length()]; // The left radius of palindrome in every position int pos = 0; int max_right = 0; int max_len = 0; int begin = 0; int end = 0; for (int i = 0; i < s.length(); i++){ if (i < max_right){ radius[i] = Math.min(radius[2 * pos - i], max_right - i); } else { radius[i] = 1; } while (i - radius[i] >= 0 && i + radius[i] < s.length() && (s.charAt(i - radius[i]) == s.charAt(i + radius[i]))){ radius[i]++; } if (i + radius[i] - 1 > max_right){ max_right = i + radius[i] - 1; pos = i; } if (radius[i] - 1 > max_len){ max_len = radius[i] - 1; begin = i - (radius[i] - 1); end = i + radius[i]; } } return s.substring(begin, end).replace("#", ""); } // Format the original string like "abc" to "#a#b#c#" for example private static String formatString(String s){ StringBuffer sb = new StringBuffer("#"); for (int i = 0; i < s.length(); i++){ sb.append(s.charAt(i) + "#"); } return sb.toString(); }}
阅读全文
0 0
- LeetCode 5. Longest Palindromic Substring
- LeetCode --- 5. Longest Palindromic Substring
- LeetCode 5.Longest Palindromic Substring
- [Leetcode] 5. Longest Palindromic Substring
- [LeetCode]5.Longest Palindromic Substring
- [leetcode] 5. Longest Palindromic Substring
- LeetCode-5. Longest Palindromic Substring
- leetcode 5. Longest Palindromic Substring
- leetcode 5. Longest Palindromic Substring
- Leetcode 5. Longest Palindromic Substring
- LeetCode 5. Longest Palindromic Substring
- Leetcode 5. Longest Palindromic Substring
- leetcode 5. Longest Palindromic Substring
- LeetCode-5. Longest Palindromic Substring
- Leetcode 5. Longest Palindromic Substring
- leetcode 5. Longest Palindromic Substring
- LeetCode *** 5. Longest Palindromic Substring
- 【leetcode】5. Longest Palindromic Substring
- iOS圆角和阴影并存
- 按位取反运算符~详解
- 数组的分页
- 海外云主机搭建IKEV2 VPN之经验总结 + 搭建证书服务器
- 爬虫实战:学者网(一)
- leetcode:5. Longest Palindromic Substring
- 【网络】端口相关概念介绍
- 【MQTT】在Windows下搭建MQTT服务器
- MATLAB中写TXT文件换行的实现
- 轻松打造APP统一标题栏
- 设置ls -l命令中显示的日期格式
- python 入门一(数据结构)
- 1092 回文字符串
- js实现ajax