Problem5

题目

原题描述:

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"
题目提炼

给定一个字符串,求出其最长的回环子串。

分析

首先解释一下回环串的定义,回环串就是形如:aba、aabbaa这种,正序和逆序都一样的字符串。由此可知,回环串一定是对称的。并且因为要求最长回环子串,所以这里必然有标记每一次结果的变量tmp与标记当前最长子串的变量result。这里给定了一个子串,让我们求出其最长的回环子串,可以从两个角度考虑,
1.一个是先找回环子串的两个端点,然后从两端逼近,这样的好处就是不需要区分子串长度为奇数还是偶数,但是缺点在于需要写三层循环。
算法如下:

1.令字符串为s,选取左端点left=0,右端点right=string.length;
2.比较两个端点的字符是s[left]与s[right]是否相同,如果不相同则right--然后跳到第4步;相同则执
行第3步。
3.令i=left+1;j=ringht-1;比较s[i]与s[j]是否相同,不相同则跳到第5步如果相同则i++,j--然后继续
比较直到s[i]与s[j]不同或者i=j;当i=j时,result=max(result,tmp)
4.ringht--,返回第2步直到right=left;
5.left++,返回第2步,直到s.length-left小于当前最长回环子串长度。

代码如下:

public String solustion(String s){

        char[] a=s.toCharArray();

        int end=0;

        int start=0;

        for(int i=0;i<s.length();i++){

            char c=a[i];

            for(int n=s.length()-1;n>i;n--){

                if(c==a[n]) {

                    char c2=c;

                    boolean flag=false;

                    for (int j = n; ; ) {

                        if (c2 == a[j]) {

                            j--;

                            if (j >i) {

                                c2 = a[n - j+i];

                            } else {

                                if((n-i)>(end-start))

                                {

                                    end=n;

                                    start=i;

                                    flag=true;

                                }

                                break;

                            }

                        } else {

                            break;

                        }

                    }

                    if (flag) {

                        break;

                    }

                }

            }

            if ((end-start)>s.length()-i)

            {

                break;

            }

        }

        return s.substring(start,end+1);

    }

2.是从回环子串的对称中心开始向两端逼近,这个的好处就是减少了循环次数,但是要判断长度为奇数还是偶数。

 public String solution2(String s){

        int center=0;

        int len=0;

        char[] a=s.toCharArray();

        for(int i=0;i<a.length;i++)

        {

            int len1=getlen(a,i,i);

            int len2=getlen(a,i,i+1);

            int len3=Math.max(len1,len2);



            if(len3>len){

                len=len3;

                center=i;

            }

            if(len>(a.length-i)*2) {
                break;
            }
        }
        return s.substring(center-(len-1)/2,center+len/2+1);
    }

    private int getlen(char[] s, int left, int right) {
        int l = left,  r= right;
        while (l >= 0 && r < s.length && s[l] == s[r]) {
            l--;
            r++;
        }
        return r - l - 1;
    }

特记

寻找最长回环字串有一个很出名的算法,叫做(马拉车)算法。他能将时间复杂度降低到O(n),但是因为这个算法不是一般性的,所以在面试笔试中不会考到,可以作为拓展了解。这个算法可以参考博客(www.cnblogs.com/bitzhuwei/p/Longest-Palindromic-Substring-Part-II.html),讲的十分详细。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 6,241评论 0 12
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,293评论 0 19
  • 标签(空格分隔): 算法 C++ 笔试 第三题:描述小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈。于是他...
    认真学计算机阅读 1,904评论 0 8
  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 1,144评论 1 1
  • 记得第一次见到老曲的时候,头发长到耳下,身穿白大褂,脚踏拖鞋,外加胡子拉碴,当真以为是哪个四十多的老师。 婚礼前夕...
    璞书茗阅读 299评论 4 2