一 字符串中的最大回文串(第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,不再遍历。

 public class Test1218 {

     public static void main(String[] args) {
String str = "ababababa";
System.out.println(longestPalindrome(str)); } public static String longestPalindrome(String s) {
if (s == null) {
return null;
}
char[] chars = s.toCharArray();
int length = chars.length;
int maxLen = 0;
String maxStr = ""; for (int i = 0; i < length; i++) { // cut branch
int possibleLength = getMaxPossibleLength(i, length);
if (possibleLength < maxLen) {
continue;
} String maxStrTmp = getMaxStrByIndex(i, chars);
if (maxLen < maxStrTmp.length()) {
maxLen = maxStrTmp.length();
maxStr = maxStrTmp;
}
}
return maxStr;
} private static int getMaxPossibleLength(int index, int length) {
int head = 0;
int tail = length - 1;
if (index == head || index == tail) {
return 1;
}
int result1 = index - head;
int result2 = tail - index; int min = result1 <= result2 ? result1 : result2;
return min * 2 + 1;
} private static String getMaxStrByIndex(int index, char[] chars) {
StringBuilder sb = new StringBuilder(String.valueOf(chars[index]));
int length = chars.length;
int head = index - 1;
int tail = index + 1; // middle deal
while (true) {
if (head >= 0 && chars[index] == chars[head]) {
sb.insert(0, String.valueOf(chars[head--]));
} else if (tail <= length - 1 && chars[index] == chars[tail]) {
sb.append(String.valueOf(chars[tail++]));
} else {
break;
}
} // besides deal
while (true) {
if (head < 0 || tail > length - 1) {
break;
}
if (head >= 0 && tail <= length - 1 && chars[head] == chars[tail]) {
sb.insert(0, String.valueOf(chars[head--]));
sb.append(String.valueOf(chars[tail++]));
continue;
}
break; }
return sb.toString();
}
}

2. dp解法

思路: 设 p[i][j] 代表下标从i至j的子字符串是否是回文串,取值为boolean

转移方程 p[i][j] = p[i+1][j-1] && chars[i] == chars[j]

初始化的状态为 p[i][i] = true    p[i][i+1] = chars[i] == chars[i+1]

看下面手绘图理解一下,打勾的对角线p[i][i] 恒为true, 只有这一列是不够状态转移的,因为按照转移方程,必须要图示的↗️方向递推,那么要需要有圆圈的一列初始化,这列对应的是p[i][i+1]。 剩下的递推即可,比如图中的箭头栗子

leetcode 算法整理的更多相关文章

  1. Leetcode——回溯法常考算法整理

    Leetcode--回溯法常考算法整理 Preface Leetcode--回溯法常考算法整理 Definition Why & When to Use Backtrakcing How to ...

  2. Leetcode——二叉树常考算法整理

    二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...

  3. BFS与DFS常考算法整理

    BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...

  4. leetcode算法: Find Bottom Left Tree Value

    leetcode算法: Find Bottom Left Tree ValueGiven a binary tree, find the leftmost value in the last row ...

  5. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  6. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  7. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  8. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  9. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

随机推荐

  1. rxjs与vue

    原创文章,转载请注明出处 使用vue-rx插件将vue和rxjs联系起来 在main.js中将vue-rx注入vue中 import Vue from 'vue' import App from '. ...

  2. 提交项目到Github

    create a new repository on the command line git init git add README.md git commit -m "first com ...

  3. c 判断数字是否无限

    /* isinf example */ #include <stdio.h> /* printf */ #include <math.h> /* isinf, sqrt */ ...

  4. String 类型的数据强转成int的方法

        有2个方法:1). int i = Integer.parseInt(str); 2). int i = Integer.valueOf(str).intValue();

  5. java代理,手把手交你写java代理

    一:常用的java代理模式 一般经常做java开发的知道java的代理模式一共有三种,第一种也就是静态代理,这种用法比较简单,没有什么魔法棒,比较好理解,另外两种分别是JDK代理和cglib代理,他们 ...

  6. Java并发指南11:解读 Java 阻塞队列 BlockingQueue

    解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ...

  7. arcgis的arcpy写入几何怎么创建一个空心面要素并读取几何和属性信息,根本不够管

    转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/83861447 这个我是没找到这 ...

  8. Methods for Identifying Out-of-Trend Results in Ongoing Stability Data

     python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  9. Qt编写自定义控件27-颜色按钮面板

    一.前言 颜色按钮面板主要用在提供一个颜色按钮面板,用户单击某个按钮,然后拿到对应的颜色值,用户可以预先设定常用的颜色集合,传入到控件中,自动生成面板颜色集合按钮,每当滑过按钮的时候,按钮边缘高亮提示 ...

  10. 【转载】CentOS7下使用LVM给系统硬盘扩容

    原文地址:https://www.cnblogs.com/ding2016/p/9680690.html 简单介绍: LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是L ...