leetcode 算法整理

Posted 宇宙唯心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 算法整理相关的知识,希望对你有一定的参考价值。

一 字符串中的最大回文串(第5题)

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of sis 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

 

Example:

Input: "cbbd"

Output: "bb"

 

1. 我的解法(accepted): 中心扩展

思路: 回文即代表有中心,一次遍历中,对于每个位置上的数字求一下最大的回文串即可,初始处理剪枝,合并掉同样的元素,如xxxxaaaxxxx,先常量级别把a合并掉; 遍历时候再次剪枝,遍历过的有一个maxLen,如果即将遍历的元素最大可能回文长度都不可能超过maxLen,不再遍历。

技术分享图片
 1     public static void main(String[] args) {
 2         String str = "ababababa";
 3         System.out.println(longestPalindrome(str));
 4 
 5     }
 6 
 7     public static String longestPalindrome(String s) {
 8         if (s == null) {
 9             return null;
10         }
11         char[] chars = s.toCharArray();
12         int length = chars.length;
13         int maxLen = 0;
14         String maxStr = "";
15 
16         for (int i = 0; i < length; i++) {
17 
18             // cut branch
19             int possibleLength = getMaxPossibleLength(i, length);
20             if (possibleLength < maxLen) {
21                 continue;
22             }
23 
24             String maxStrTmp = getMaxStrByIndex(i, chars);
25             if (maxLen < maxStrTmp.length()) {
26                 maxLen = maxStrTmp.length();
27                 maxStr = maxStrTmp;
28             }
29         }
30         return maxStr;
31     }
32 
33     private static int getMaxPossibleLength(int index, int length) {
34         int head = 0;
35         int tail = length - 1;
36         if (index == head || index == tail) {
37             return 1;
38         }
39         int result1 = index - head;
40         int result2 = tail - index;
41 
42         int min = result1 <= result2 ? result1 : result2;
43         return min * 2 + 1;
44     }
45 
46     private static String getMaxStrByIndex(int index, char[] chars) {
47         StringBuilder sb = new StringBuilder(String.valueOf(chars[index]));
48         int length = chars.length;
49         int head = index - 1;
50         int tail = index + 1;
51 
52         // middle deal
53         while (true) {
54             if (head >= 0 && chars[index] == chars[head]) {
55                 sb.insert(0, String.valueOf(chars[head--]));
56             } else if (tail <= length - 1 && chars[index] == chars[tail]) {
57                 sb.append(String.valueOf(chars[tail++]));
58             } else {
59                 break;
60             }
61         }
62 
63         // besides deal
64         while (true) {
65             if (head < 0 || tail > length - 1) {
66                 break;
67             }
68             if (head >= 0 && tail <= length - 1 && chars[head] == chars[tail]) {
69                 sb.insert(0, String.valueOf(chars[head--]));
70                 sb.append(String.valueOf(chars[tail++]));
71                 continue;
72             }
73             break;
74 
75         }
76         return sb.toString();
77     }
View Code

 

2. dp解法

 

 



以上是关于leetcode 算法整理的主要内容,如果未能解决你的问题,请参考以下文章

VS2015 代码片段整理

LeetCode算法题 菜鸟总结 持续更新中

Leetcode拾萃(算法篇)——暴力破解(DFSBFSpermutation)

小程序各种功能代码片段整理---持续更新

熬夜肝了这一份来自牛客,LeetCode,剑指 Offer大佬整理的前端常用算法面试题.pdf,你也能进大厂

熬夜肝了这一份来自牛客,LeetCode,剑指 Offer大佬整理的前端常用算法面试题.pdf,你也能进大厂