Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Manacher算法 && Longest && Shortest Palindrome

Manacher算法 && Longest && Shortest Palindrome

原创
作者头像
大学里的混子
修改于 2019-02-22 09:52:51
修改于 2019-02-22 09:52:51
33300
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

一、Manacher算法、

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static char[] mannacherString( String str){
        char[] charArr = str.toCharArray();
        char[] res = new char[str.length()*2+1];
        int index = 0;
        for (int i = 0;i<res.length;i++){  // 偶数的位置设为 #
            res[i] = (i&1) == 0 ? '#':charArr[index++];
        }
        return res;
    }

public static int maxLcpsLength(String str) {
        if (str == null || str.length() == 0){
            return 0;
        }
        char[] charArr = mannacherString(str);
        int[] pArr = new int[charArr.length];
        int index = -1;
        int pR = -1;
        int max = Integer.MIN_VALUE;
        for (int i = 0;i != charArr.length;i++){
            pArr[i] = pR > i ? Math.min(pArr[2 * index - i],pR - i) :1;
            while (i + pArr[i] < charArr.length && i - pArr[i] > -1){
                if (charArr[i+pArr[i]] == charArr[i - pArr[i]]){
                    pArr[i]++;
                }else break;
            }
            if ( i + pArr[i] > pR){
                pR = i +pArr[i];
                index = i;
            }
            max = Math.max(max,pArr[i]);
        }
        return max - 1;
    }

二、214.Shortest Palindrome

Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.

Example 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: "aacecaaa"
Output: "aaacecaaa"

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: "abcd"
Output: "dcbabcd"

解法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static char[] manacherStr(String str){
    char [] chars = str.toCharArray();
    char [] res = new char[str.length()*2 + 1];
    for (int i = 0 ; i < res.length;i++){
        res[i] = (i & 1) == 0 ? '#': chars[i/2];
    }
    return res;
}

public static String shortestPalindrome(String s) {
    if (s == null || s.length() < 2) return s;
    StringBuffer stringBuffer = new StringBuffer(s);
    stringBuffer.reverse();
    String revStr = new String(stringBuffer);
    char[] chars = manacherStr(revStr);
    System.out.println(chars);
    int pArr [] = new int[chars.length];
    int pR = -1;
    int index = -1;
    int maxContainEnd = -1;
    for ( int i = 0 ;i < pArr.length;i++){
        pArr[i] = (pR > i) ? Math.min(pR - i ,pArr[ 2 * index - i]):1;
        while ( i + pArr[i] < pArr.length && i - pArr[i] >=0){
            if (chars[i + pArr[i]] == chars[ i - pArr[i]]){
                pArr[i]++;
            }else break;
        }
        if ( i + pArr[i] > pR){
            pR = i + pArr[i];
            index = i;
        }

        if (pR == chars.length){
            maxContainEnd = pArr[i];
            break;
        }
    }
    StringBuffer stringBuffer1 = new StringBuffer(revStr);
    for (int i = (pArr.length -(2 * maxContainEnd - 1)) /2 - 1; i >= 0;i--){
        stringBuffer1.append(stringBuffer1.charAt(i));
    }
    return String.valueOf(stringBuffer1);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Manacher算法
 求最大回文子串的长度一般要看原串的长度是奇数还是偶数,然后分别求得,但Manacher算法的第一个神奇之处就是把两种字符串都化为长度为奇数,从而简化计算:
mathor
2018/08/13
8640
Manacher算法
Leetcode 题目解析之 Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
ruochen
2022/02/13
1.3K0
【LeetCode题解---003】Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
周三不加班
2019/09/04
4330
【LeetCode题解---003】Longest Substring Without Repeating Characters
字符串例题
 给定一个字符串s,请计算输出含有连续两个s作为子串的最短字符串。注意两个s可能有重叠部分。例如,"ababa"含有两个“aba". 输入描述:  输入包括一个字符串s,字符串长度length(1<=length<=50),s中每个字符都是小写字符。 输出描述:  输出一个字符串,即含有连续两个s作为子串的最短字符串。 示例1  输入:abracadabra  输出:abracadabracadabra  思路:求出原字符串的next数组,假设原字符串长度为n,再求next[n]位置的值,表示后面需要补下标为next[n]开始到结尾的字符,举个例子:str=abracadabra,next值分别是-1,0,0,0,1,0,1,0,1,2,2,然后再求next[n]的值为4,所以从下标为4开始一直往后的字符全部添加到结尾就变成了abracadabracadabra
mathor
2018/08/13
4040
Java算法篇(一)
结题思路:先利用Arrays.sort(strs)为数组排序,再将数组第一个元素和最后元素的字符从前往后对比即可。
OY
2022/03/20
2240
Java算法篇(一)
LeetCode 214. Shortest Palindrome(回文串,回文树,KMP)
https://leetcode.com/problems/shortest-palindrome/
ShenduCC
2020/02/18
4810
Java工具集-数学(数字工具类)
简单工具类 写作初衷:由于日常开发经常需要用到很多工具类,经常根据需求自己写也比较麻烦 网上好了一些工具类例如commom.lang3或者hutool或者Jodd这样的开源工具,但是 发现他们之中虽然设计不错,但是如果我想要使用,就必须要引入依赖并且去维护依赖,有些 甚至会有存在版本编译不通过问题,故此想要写作一个每个类都可以作为独立工具类使用 每个使用者只需要复制该类,到任何项目当中都可以使用,所以需要尊从以下两个原则才能 做到.在此诚邀各位大佬参与.可以把各自用过的工具,整合成只依赖JDK
cwl_java
2019/10/26
1.4K0
【剑指Offer】58.2 左旋转字符串
先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”。
瑞新
2020/12/07
3750
字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。
MickyInvQ
2022/05/06
2070
大话字符串逆序
面试官:“先来一点基础的吧,用Java写一个方法,入参是一个字符串,返回逆序后的字符串。”
万猫学社
2022/04/22
2070
把字符串转换成整数(java) 剑指offer
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0.
用户7886150
2020/12/11
4720
LeetCode 0214 - Shortest Palindrome
Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
Reck Zhang
2021/08/11
1620
左旋转字符串
先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”。
MickyInvQ
2021/12/07
1330
LeetCode Weekly Contest 42解题思路
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014688145/article/details/75911369
用户1147447
2019/05/26
4710
LeetCode63|香山碧云寺云碧山香
1,问题简述 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 2,示例 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 2: 输入: "race a car" 输出: false 3,题解思路 双指针使用 4,题解程序 public class IsPalindromeTest { public static void main(Strin
码农王同学
2020/09/28
3540
LeetCode63|香山碧云寺云碧山香
palindrome - 132. Palindrome Partitioning II
Given a string s, partition s such that every substring of the partition is a palindrome.
ppxai
2020/09/23
2970
剑指Offer(二十七)-- 字符串的排序
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
秦怀杂货店
2022/02/15
3070
leetCode169|转换为小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
码农王同学
2021/01/15
4100
Java工具集-字符串(StringUtils)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/10/28
1.6K0
算法题目
import java.util.*; class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int value){ this.val = value; } } class ListNode { int val; ListNode next; public ListNode(int value){ this.val = value; } } class TrieNode {
大学里的混子
2019/03/08
7370
相关推荐
Manacher算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验