最长回文子串解法

原题地址:https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description

没咋么过脑子,瞬间能想到的思路大概为:

"abcabcbb"
比如这个字符串
首先 声明一个数组  里面存放各种开分来的字符串; 切分条件是当这次循环的值 存在于当前的数组中

像这样
abc bca cab abc bcb cb

最初的实现代码:

var str = "";
    //生成一些随机字符
    for(var i =0;i<1000000;i++){
        str +=String.fromCharCode(Math.floor(97+Math.random()*(122-97)));
    }

    var resulte = [];//保存字符串结果
    var index = 0;//索引

while(str.length){
        for(var i =0;i<str.length;i++){
            resulte[index] = resulte[index]||"";
            if(resulte[index].indexOf(str[i]) === -1){
                resulte[index]+=str[i];
            }else{
                break;
            }
        }
        str = str.slice(1);
        index++;
    }
    console.log(resulte)

第二日优化代码:

思路:

bcadeaopqrxyz

当上面的2个a 相遇的时候

第一个数组中应该存放的值为: bcade

首先能确定的是 bcade 肯定是正确的格式(无重复的字符串)

其次能确定的是  bcadea 绝对大过于 cade ade de

也就是说 第一个a之前的值不用再循环了,循环直接从第一个a后面的值开始即可;

var str = "";
    //生成一些随机字符
    for(var i =0;i<1000000;i++){
        str +=String.fromCharCode(Math.floor(97+Math.random()*(122-97)));
    }
    var resulte = [];//保存字符串结果
    var index = 0;//索引
    var maxStr = "";

while(str.length){
        for(var i =0;i<str.length;i++){
            resulte[index] = resulte[index]||"";
            if(maxStr.length > str.length){
                str = "";
                break;
            }
            var _pos  = resulte[index].indexOf(str[i]);
            var _step = 0;
            if(_pos === -1){
                resulte[index]+=str[i];
                maxStr = maxStr.length < resulte[index].length ? resulte[index] : maxStr;
            }else{
                // resulte[index+1] = resulte[index].slice(_pos+1) //这里还可优化
                _step = str.indexOf(str[i]);
                break;
            }
        }
        str = str.slice(_step+1);
        index++;
    }
console.log(maxStr)
时间: 2024-08-04 08:24:21

最长回文子串解法的相关文章

[转]最长回文子串——4种解法

题记: 最近刚研究了动态规划,感觉确实是算法思想中比较晦涩深奥的一种,解法2就是用动态规划,一般都是用数组记录尝试过的解法结果,为后续的解法提供剪枝.对于这道题目,解法1,解法3的思路比较简单易懂. 解法1:用两个for循环找出所有子串,第三个for循环用于判断该子串是否为回文,是回文则且比已找到的回文串长就替换,算法时间效率为O(n^3) 解法3:用for循环遍历字符串的每一个字符,每找到一个字符就以此为中心,往两边拓展,看左右字符串是否相等.但是回文有两种类型,一种为奇数,一种偶数,如下:

最长回文子串的不同解法

给定一个字符串,返回该字符串的最长回文子串,回文也就是说 ,正着读和反着读是一样的.下面总结了几种求回文的方式: 方法1 : 很简单,枚举所有的区间 [i,j] ,查看该范围内是否是一个回文.   时间复杂度 O(n^3),空间复杂度 O(1). 方法2: 方法1的时间复杂度太高,并且存在着大量的重复运算,可以使用DP来解,并且保存已经检查过的字符串的状态.   时间复杂度: O(n^2),空间复杂度O(n^2). 这里存在两种DP的方法,是根据区间来进行DP,还是长度,不过都是大同小异,不改变

Manacher算法----最长回文子串

题目描述 给定一个字符串,求它的最长回文子串的长度. 分析与解法 最容易想到的办法是枚举所有的子串,分别判断其是否为回文.这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包含另一个短一些的子串,那么对子串的回文判断其实是不需要的.同时,奇数和偶数长度还要分别考虑. Manacher算法可以解决上述问题,并在O(n)时间复杂度内求出结果.下面我们来看一下Manacher算法. 首先,为了处理奇偶的问题,在每个字符的两边都插入一个特殊的符号,这样所有的奇数或偶数长度都转换为奇数长度.比

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

最长回文子串(转自:hihoCoder)

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

转载:LeetCode:5Longest Palindromic Substring 最长回文子串

本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 求字符串的最长回文子串 算法1:暴

#1032 : 最长回文子串

描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是12421这种从前往后读和从后往前读一模一样的字符串,所以最长回文子串的意思就是这个字符串中最长的身

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

[LeetCode]33. Longest Palindromic Substring最长回文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 解法一:考虑回文字符串paliStr的特征,分为字符串长度为奇偶两种情况:(1)paliStr.size()为奇数时,则从最中间的一个字符往两边扩展是