首页 > 编程语言 >最长回文子串时间复杂度为O(n)的算法

最长回文子串时间复杂度为O(n)的算法

时间:2023-07-12 14:49:32浏览次数:44  
标签:子串 int 复杂度 最长 字符串 chars 回文

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"
 

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring

 示例代码:

 1 public class Test {
 2     public static void main(String[] args) {
 3         System.out.println(longestPalindrome("88111211109"));
 4     }
 5 
 6     public static char[] manacherString(String s){ //将字符串转化为长度为2*字符串长度+1的数组
 7         char[] chars = new char[s.length()*2+1];
 8         char[] chars1 = s.toCharArray();
 9         int index=0;
10         for (int i = 0; i < chars.length; i++) {
11             chars[i] = (i&1)==0?'#': chars1[index++];
12         }
13         return chars;
14     }
15 
16     public static String  longestPalindrome(String s){
17         char[] chars = manacherString(s);
18         int start=0;
19         int end = 0;
20         int maxStart = 0;//记录最长回文字符串的初始索引
21         int maxEnd = 0;//记录最长回文字符串的末尾索引
22         int max=Integer.MIN_VALUE;//最大回文字符串长度
23         for (int i = 0; i < chars.length; i++) {
24             start = i;
25             end = i;
26             while (start>0&&end<chars.length-1&&chars[start-1]==chars[end+1]){//以每个遍历的字符为中心向左右两边扩展
27                 start--;
28                 end++;
29             }
30             int len=end-i;
31             if (len>max){
32                 max=len;
33                 maxStart = start;
34                 maxEnd = end;
35             }
36         }
37 
38         StringBuilder sb = new StringBuilder();
39         for (int i = maxStart; i < maxEnd; i++) {
40             if (chars[i] != '#') {
41                 sb.append(chars[i]);
42             }
43         }
44 
45         return sb.toString();
46     }
47 
48 
49 }

 

这段代码是用来查找字符串中最长回文子串的。它使用了 Manacher 算法,该算法可以在线性时间内找到最长回文子串。 首先,manacherString 函数将输入字符串转换为长度为 2 * 字符串长度 + 1 的字符数组。它通过在每个字符之间插入 # 字符来实现这一点。例如,字符串 "abc" 将被转换为字符数组 ['#', 'a', '#', 'b', '#', 'c', '#']。 接下来,longestPalindrome 函数使用上面生成的字符数组来查找最长回文子串。它从左到右遍历字符数组,并对于每个位置,向左右两边扩展,直到不再是回文串为止。然后记录下最长的回文子串的起始和结束位置。 最后,函数使用 StringBuilder 来构建最终的回文子串,并返回结果。 例如,在上面给出的代码中,输入字符串为 "88111211109",经过 manacherString 函数转换后的字符数组为 ['#', '8', '#', '8', '#', '1', '#', '1', '#', '1', '#', '2', '#', '1', '#', '1', '#', '1', '#', '0', '#', '9', '#']。然后,longestPalindrome 函数找到最长的回文子串为 "21112",并返回结果。

标签:子串,int,复杂度,最长,字符串,chars,回文
From: https://www.cnblogs.com/FangwayLee/p/17547434.html

相关文章

  • LeetCode 234. 回文链表
    classSolution{public:ListNode*reverse(ListNode*head)//翻转以head为头节点的链表{if(!head||!head->next)returnhead;autoa=head,b=head->next;while(b){autoc=b->next;b->next=a;......
  • 100000之内取回文数
    #include<iostream>/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("pause")orinputloop*/usingnamespacestd;intmain(intargc,char**argv){system("pause");intge,shi,bai,qian,wan;......
  • 时间复杂度
    主定理 递推式子的时间复杂度求法\[T(n)=aT(\frac{n}{b})+f(n),n>=b\] 其中:$n$是问题规模的大小\(a\)是原问题的子问题个数\(\frac{n}{b}\)是每个子问题的大小\(f(n)\)是子问题合并成原问题所需的代价 分三种情况:$f(n)<n^{\log_b^a}$,那么$T(n)......
  • 添加虚拟原点降低建图复杂度
    ##需求存在一个大小为$n$的点集$V_1$和大小为$m$的点集$V_2$,$V_1$中的每个点都需要向$V_2$中的每个点连一条边##$n*m$条边![](https://cdn.jsdelivr.net/gh/G-ghy/cloudImages@master/20211007155650.png)当$n$和$m$数值较大或者需要建图多次时,一定概率会超内存或者遍历时超......
  • 爬天梯 + 放苹果 (记忆化搜索大大优化时间复杂度)
    记忆化搜索——即把搜过的地方记录下来,后面再搜的时候直接取就好了 题解:1#include<iostream>2usingnamespacestd;3#definelllonglong4constintN=100;5lla[N],n;6lldfs(lln)7{8if(n<=1)9return1;1011if(!a......
  • C++黑马程序员——P193-196. string容器 字符串比较,字符存取,字符串插入和删除,子串
    P193.string容器——字符串比较P194....——字符存取P195....——字符串插入和删除P196....——子串获取P193.字符串比较 ——————————————————————————————————————————————————————————1//字符......
  • 【动态规划】子串、子序列问题
    目录应用应用1:Leetcode647.回文子串题目解题思路动态规划边界条件状态转移代码应用应用1:Leetcode647.回文子串题目647.回文子串解题思路动态规划设\(dp[i][j]\)表示子串\(s[i\cdotsj]\)是否是回文子串,若\(dp[i][j]=True\),则表示子串\(s[i\cdotsj]\)是回......
  • C# 上传文件至指定目录,并返回文件路径
     ///<summary>///上传图片并返回文件路径///</summary>///<paramname="file"></param>///<returns></returns>[HttpPost("UploadImage")]publicasync......
  • 最详细的解说—时间和空间复杂度
    转载自:https://www.jianshu.com/p/1ac6ad4069f8 算法的选择我们都知道同一个问题有不同的算法解决,这些算法在运行时间、运行占用内存、代码易读性等方面都不相同,而在这些算法中,我们只能选择一种解决方案,这时判断选择哪个算法的依据是什么呢?   在这里,我们引入了时......
  • 【LeetCode剑指offer#05】回文链表的两种解法+删除链表中间节点(链表的基本操作)
    回文链表给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105]内0<=Node.val<=9思路将值复制到数组中后用双指针......