LeetCode 5 最大回文子串
2015-09-14 15:20
246 查看
最大回文子串问题 暴力法肯定超时 请参考百度上的搜索结果 这里只是简单提一下和心思想
加什么符号%@#&……的不说了随意就好 设置数组其他文章里也有(这里为len[])
这里说三个主要变量
例子 12321**************(后面的元素暂时没有遍历到)
max 当前已经搜索到的最大字串的半径(max=3)
pos 最大字串对称点(2,0开始)
I 当前遍历到的元素序号
核心思想为三个判断
1. I<max且max-I>len[2*pos-i](找到与i关于pos对称位置的元素)。这里说的是根据回文字串特性,如果当前的元素s[I]在一个更大的回文字串中,且距离边界的距离小雨i关于pos对称点的距离,说明以s[I]为中心的回文字串完全包括在这个更大的字串中,且有一个对称的“兄弟”。这时候len[i]=len[2-pos-i]
2. I<max且max-I<=len[2*pos-i] 这情况说明以I为中心的回文串可能会超过最大边界max,这时候就需要进行中心扩展匹配, 算法大家都会。
3. I>max 没说的 这时候已经遍历到未知区域了 只能去匹配。
c# code
public class Solution { public string LongestPalindrome(string str) { string s = Init(str); //Console.WriteLine(s); int[] len = new int[s.Length]; int max = 0, pos = 0; for (int i = 0; i < len.Length; i++) { if (i < max) { if (len[2 * pos - i] < max - i) { len[i] = len[2 * pos - i]; } else { int a = Extend(i, s); if (a > max) { max = a; pos = i; } } } else { int a = Extend(i, s); if (a > max) { max = a; pos = i; } } } string result = ""; for (int i = pos - max + 1; i < pos + max - 1; i++) { result += s[i]; } return result.Replace("#",""); } static string Init(string s) { char[] str = new char[2 * s.Length + 1]; for (int i = 0; i < s.Length; i++) { str[i * 2 + 1] = s[i]; str[2 * i] = '#'; str[str.Length - 1] = '#'; } return new string(str); } static int Extend(int i,string s) { int a = 0; while (i - a >= 0 && i + a < s.Length && s[i + a] == s[i - a]) { a++; } return a; } }
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解