最长回文子串计算(fail)
题意:
给定一个字符串s,在s中找到最长的回文子字符串。您可以假设s的最大长度为1000。
例子:
输入: “babad” 输出: “bab” 注: “aba”也是一个有效的答案。
我的答案:
想法:既然是回文字符串,就表示字符串正序倒序是一样的,先假设有一个turnString,把字符串翻转;整体思想是:从第0个元素开始遍历字符串,当比较到第i个字符时,从0开始到(i-1)为起始,(i-1)为终止的所有子串都比较一遍,找出最长回文子串,然后i++,直到比较完为止:
public static String longestPalindrome(String s) {
String str = String.valueOf(s.charAt(0));
for(int i=0; i<s.length(); i++){
for(int j=0; j<i; j++){
String sp = turnString(s.substring(j, i+1));
if((sp.equals(s.substring(j, i+1))) && sp.length()>str.length()){
str = s.substring(j, i+1);
}
}
}
return str;
}
public static String turnString(String str) {
String s = "";
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
s = s + c;
}
return s;
}
问题:
时间复杂度过大。
基于每次都要比较这个问题,增大了时间复杂度,抓住回文字符串的一个特点:起始和结尾的字符是相同的,那么假设比较到了字符'a',那么就可以当且仅当前边子串中有相同字符时才翻转比较,并且只比较以a开头的,这样就降低了很大的时间复杂度。
下面是优化过的方法,其中优化了turnString方法为isTurn方法,用来直接判断某字符串是否为回文字符串,除此之外还做了其他优化:
public static String longestPalindrome(String s) {
String str = String.valueOf(s.charAt(0));
for(int i=0; i<s.length(); i++){
if(s.contains(String.valueOf(s.charAt(i)))){
for(int j=0; j<i; j++){
if((s.charAt(i)==s.charAt(j)) && isTurn(s.substring(j, i+1)) && (i+1-j)>str.length()){
str = s.substring(j, i+1);
break;
}
}
}
}
return str;
}
public static boolean isTurn(String str) {
boolean bool = false;
String s = "";
for (int i = str.length() - 1; i >= 0; i--) {
char c = str.charAt(i);
s = s + c;
}
if(s.equals(str))
bool = true;
return bool;
}
问题:由于isTurn函数的原理是将字符串完全颠倒后比较,浪费时间,为了提高效率,改为字符级别的比较,还优化了加入了start和end两个整形变量,减少了没必要的字符串切割,修改后如下:
public static String longestPalindrome(String s) {
int start=0,end=1;
for(int i=0; i<s.length(); i++){
if(s.contains(String.valueOf(s.charAt(i)))){
for(int j=0; j<i; j++){
if((s.charAt(i)==s.charAt(j)) && isTurn(s.substring(j, i+1)) && (i+1-j)>(end-start)){
start = j;
end = i+1;
break;
}
}
}
}
return s.substring(start,end);
}
public static boolean isTurn(String str) {
boolean bool = true;
for(int i=0,j=str.length()-1; i<j; i++,j--){
if(str.charAt(i) != str.charAt(j)){//若不相同,退出
bool = false;
break;
}
}
return bool;
}
但是效率上还是有问题,超过了leetcode规定的时间复杂度。
下面是LeetCode给的解决方案:
class Solution {
public String longestPalindrome(String s) {
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
} private int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
}
这个方法很有意思,很好的利用了回文子串对称的特点。举个例子,字符串aba和字符串abba都是回文字符串,特点就是对称,只不过aba的对称中心是一个字母b,而abba的对称中心是bb两个字母。而且只需要考虑这两种状况即可,那么,我们就可以写一个函数,从第i个字符向周边幅散型比较,此时只有两种情况:
1 以第i个字符为中心幅散
2 以第i个和第i+1个两个字符为中心幅散。
这样比较起来就比我自己写的降低了更多的复杂度。也是利用会文字符串本身特点想出来的优质方法。
最长回文子串计算(fail)的更多相关文章
- 计算字符串的最长回文子串 :Manacher算法介绍
转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 求最长回文子串:Manacher算法
主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右 ...
- [译+改]最长回文子串(Longest Palindromic Substring) Part II
[译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...
- [译]最长回文子串(Longest Palindromic Substring) Part I
[译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...
- Manacher's algorithm: 最长回文子串算法
Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串O(n)算法
原文链接:英文版链接 首先,我们将字符串S中插入符号“#”转化成另一个字符串T. 比如:S = "abaaba",T = “#a#b#a#a#b#a#”. 为了找到最长回文字串,我 ...
- Manacher算法----最长回文子串
题目描述 给定一个字符串,求它的最长回文子串的长度. 分析与解法 最容易想到的办法是枚举所有的子串,分别判断其是否为回文.这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包含另一个短一些 ...
随机推荐
- ASP.NET Core优化MD5加密
MD5是我们常用的一种加密方式,但是有朋友和我说C#自带的MD5方法碰撞阻力太低,担心安全问题 然后我这里开源一下我日常使用的优化后的MD5加密方法 代码中先创建出MD5对象后对字符串先进行MD5加密 ...
- thinkphp5 部署到iis服务器url重写
thinkphp部署到iis服务器配置url重写的解决方法: 1.下载 url rewrite.下载地址:https://www.iis.net/downloads/microsoft/url-rew ...
- Java 8 中有趣的操作 Stream
Stream 不是java io中的stream 对象创建 我们没有必要使用一个迭代来创建对象,直接使用流就可以 String[] strs = {"haha","hoh ...
- Go语言中的变量
1 概述 变量(Variable)是程序运行过程中,内容可以变化(修改)的量,变量的功能是存储用户的数据,是计算机语言中能储存计算结果或能表示值抽象概念.变量,是通过变量的标识符定位值的过程.变量的内 ...
- ORB-SLAM(十一)EPnP
EPnP在ORB-SLAM中主要用于Tracking线程中的重定位Relocalization模块,需要通过当前关键帧Bow与候选帧匹配上的3D地图点,迅速建立当前相机的初始姿态. PnP问题解决了已 ...
- Python-内置函数4
import time # 返回时间戳 t=time.time() print(t) name="one" ''' bin() oct() hex() bytes() ascii( ...
- eclipse+tomcat配置远程debug调整
由于开发环境与真实服务器环境存在差异,有时开发时明明正常的逻辑,部署之后就会出现各种各样的问题,通过日志邮不能明确定位到问题的时候,可以采用远程debug调试来定位问题.下面就介绍一下具体的配置步骤: ...
- XSS----payload,绕过,xss小游戏记录
一.XSS 1.原理:攻击者把恶意的脚本代码注入到网页中,等待其他用户浏览 这些网页(或触发其他条件),从而执行其中的恶意代码. 1.xss实例代码: test.html <!DOCTYPE h ...
- 各种对list,string操作函数的总结
#encoding=utf-8#reverse,用来反转lista=['aa','bb','cc']a.reverse()print a#['cc', 'bb', 'aa']#不能直接print a. ...
- 韦大仙python--购物车
程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...