博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5. Longest Palindromic Substring
阅读量:5094 次
发布时间:2019-06-13

本文共 1966 字,大约阅读时间需要 6 分钟。

最长回文串

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

Example:

Input: "babad"Output: "bab"Note: "aba" is also a valid answer.

 

Example:

Input: "cbbd"Output: "bb" 1.时间复杂度为O(N²)的算法-从中间向两边展开

回文字符串显然有个特征是沿着中心那个字符轴对称。比如aha沿着中间的h轴对称,a沿着中间的a轴对称。那么aa呢?沿着中间的空字符''轴对称。 所以对于长度为奇数的回文字符串,它沿着中心字符轴对称,对于长度为偶数的回文字符串,它沿着中心的空字符轴对称。 对于长度为N的候选字符串,我们需要在每一个可能的中心点进行检测以判断是否构成回文字符串,这样的中心点一共有2N-1个(2N-1=N-1 + N)。 检测的具体办法是,从中心开始向两端展开,观察两端的字符是否相同。代码如下:

//从中间向两边展开  string expandAroundCenter(string s, int c1, int c2) {    int l = c1, r = c2;    int n = s.length();    while (l >= 0 && r <= n-1 && s[l] == s[r]) {      l--;      r++;    }    return s.substr(l+1, r-l-1);  }     string longestPalindromeSimple(string s) {    int n = s.length();    if (n == 0) return "";    string longest = s.substr(0, 1);  // a single char itself is a palindrome    for (int i = 0; i < n-1; i++) {      string p1 = expandAroundCenter(s, i, i); //长度为奇数的候选回文字符串      if (p1.length() > longest.length())        longest = p1;         string p2 = expandAroundCenter(s, i, i+1);//长度为偶数的候选回文字符串      if (p2.length() > longest.length())        longest = p2;    }    return longest;  }

2.

参考:

string longestPalindrome(string s) {        string t ="$#";        for (int i = 0; i < s.size(); ++i) {            t += s[i];            t += '#';        }        int p[t.size()] = {
0}, id = 0, mx = 0, resId = 0, resMx = 0; for (int i = 0; i < t.size(); ++i) { p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; while (t[i + p[i]] == t[i - p[i]]) ++p[i]; if (mx < i + p[i]) { mx = i + p[i]; id = i; } if (resMx < p[i]) { resMx = p[i]; resId = i; } } return s.substr((resId - resMx) / 2, resMx - 1); }

(一开始不理解为什么最后获取子串是((resId - resMx) / 2),因为里面填充了 “#”)

同时还有

           

转载于:https://www.cnblogs.com/wft1990/p/6941133.html

你可能感兴趣的文章
python第九天课程:遇到了金角大王
查看>>
字符串处理
查看>>
ECharts(Enterprise Charts 商业产品图表库)初识
查看>>
LeetCode Factorial Trailing Zeroes (阶乘后缀零)
查看>>
hdu 5402 Travelling Salesman Problem (技巧,未写完)
查看>>
[AIR] 获取U盘,打开U盘
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
asp.net 获取IP地理位置的几个主要接口
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
开启Spark history server
查看>>
【转】Linux内核调试方法总结
查看>>
一道不知道哪里来的容斥题
查看>>