原题链接:#5 Longest Palindromic SubString
要求:
给定一个字符串S,找出它的最长回文子串。假定S的最大长度为1000,且最长回文子串唯一
难度:中等
分析:
假定字符串s为回文字符串,则在s头部和尾部分别添加相同字符串[x],所得结果s'=[x]s[x]也为回文字符串(论述1)。可使用动态规划方法解决此问题,递推公式便基于此特性。
创建一个布尔二维数组plain,plain[i][j]为true表示原字符串从索引i到索引j这一段子串为回文。而plain[i][j]为true的前提是s.charAt(i)与s.charAt(j)相同,且以下两个条件满足其一:
1. j-i<=2, j=i时必然成立,j-i=1则表示i与j相邻,"aa"、"bb"满足条件
2. j-i>2, 此时须plain[i+1][j-1]为true,即论述1所述
核心算法分析完毕,写一双重循环,索引i由字符串尾部向前遍历,索引j由i向后遍历,每次发现回文字符串时设置二维数组相应的值,并比较其长度是否大于当前的maxLen。若大于,则更新用于记录当前最长回文子串起始和终止位置的start和end
解决方案:
Java - 396ms
public String longestPalindrome(String s) { if(s.length()<=1){ return s; } int start=0, end=0; int maxLen = 0; boolean[][] plain = new boolean[s.length()][s.length()]; for(int i=s.length()-1;i>=0;i--){ for(int j=i;j<s.length();j++){ if(s.charAt(i)==s.charAt(j)&&(j-i<=2||plain[i+1][j-1])){ plain[i][j]=true; if(maxLen<j-i+1){ maxLen = j-i+1; start = i; end = j; } } } } return s.substring(start, end+1); }
相关推荐
c语言入门 c语言_leetcode题解05-longest-palindromic-substring.c
js js_leetcode题解之5-longest-palindromic-substring.js
java入门 java_leetcode题解之005_Longest_Palindromic_Substring
c c语言_leetcode 0005_longest_palindromic_substring.zip
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Java AC 版本
Longest-Palindromic-Substring(最长回文子串) 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 Sample 1 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 Sample 2 输入...
5. leetCode-5-Longest-Palindromic-Substring.md:第5题,最长回文子串,考察字符串处理和动态规划。 6. leetCode-84-Largest-Rectangle-in-Histogram.md:第84题,柱状图中最大的矩形,涉及到数组处理和栈的数据...
最大公共字符串leetcode 最长回文子串 给定一个字符串 s,找出 s 中最长的回文子串。 您可以假设 s 的最大长度为 1000。 Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example 2: ...
最大公共字符串leetcode 最长回文子串 给定一个字符串 s,找出 s 中最长的回文子串。 您可以假设 s 的最大长度为 1000。 示例 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 示例 2: ...
leetcode中文版 LeetCode # Title Chinese Tag Solution 1 Two Sum 两数之和 array,hash 2 Add Two Numbers 两数相加 math 3 Longest Substring Without Repeating Characters 无重复字符的最长子串 string 4 ...
leetcode ...#5:Longest Palindromic Substring 链表 #2:Add Two Numbers 分而治之 #53:Maximum Subarray 队列/集 #3:Longest Substring Without Repeating Characters 优先队列 #23:Merge k Sorted Lists
本文档为LeetCode题解的Java语言实现,涵盖了181页的内容,涉及到数组、链表、树、图、动态规划、回溯算法等多种数据结构和算法。 1. Rotate Array in Java 数组旋转是一个基本的数组操作,要求将数组中的元素旋转...
leetcode题库 LeetCode-Go 理论基础 见Note 脑图 TODO 待填充 算法题 面试高频出现,以及一些非常经典重要的算法题优先 题目列表 No Title Link Solution Acceptance Difficulty Topics Solution 0001 Two Sum 46.1%...
颜色分类leetcode My Leetcode Problems Solutions Using javascript(ES6) 1 Two Sum 两数之和 5 Longest Palindromic Substring 最长回文子串 7 Reverse Integer 整数反转 9 Palindrome Number 回文数 11 Container...
分割数组求最大差值leetcode LeetCode 学习之路 记录自己完成LeetCode的代码和结果。 序号 中文名称 英文名称 通过率 难度 1 Two Sum 47.0% 简单 2 Add Two Numbers 36.0% 中等 3 Longest Substring Without ...
leetcode 2sum # Programming-Problems This will have many problems from all over the web, As of writing this readme there is Haskell 99: 28 finished + Huffman Coding LeetCode: LC1: 2Sum [Easy] LC2: Add...
动态规划 重要 Integer to Roman 中等 重要 Roman to Integer 简单 重要 Longest Common Prefix 简单 字串 Valid Parentheses 简单 堆叠 重要 Merge Two Sorted Lists 简单 链结串列 重要 Remove Duplicates from
leetcode 2 sum c leetcode 力扣(Leetcode)编程题,JavaScript版本。 编号 中文题目 英文题目 题目描述 JavaScript 难度 1 Two Sum 简单 2 Add Two Numbers 中等 3 Longest Substring Without Repeating... 中等 5...
动态规划,背包问题 01背包问题:416. Partition Equal Subset Sum 最长回文:5. Longest Palindromic Substring - 字数组余数:523. Continuous Subarray Sum - 无重复字符的最长子串:3. Longest Substring ...
leetcode叫数 尽量实现5种语言的版本: c c++ java python js 实现的顺序也按照这个来。首先实现C语言的版本。然后c++,依次类推。 按照题目编号来做。 文件名统一都叫Solution.x。x表示对应的后缀。 主要还是用...