leecode第5题

来源:互联网 发布:ip地址定位软件 编辑:程序博客网 时间:2024/05/09 03:26

5.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.

题目大意就是求出一个字符串的最大回文子串,思路借鉴了讨论区中的某位同学,就是用两个标记依次往两头延伸,如给定a,b,判断s[a-1]与s[b+1]是否相等,若相等则–a, ++b在进行判断,直到不等为止,得出maxlen=b-a+1,代码运行时间4ms。代码如下:

string longestPalindrome(string s)     {        if (s.empty() || 1 == s.size())        return s;        int i, a, b, mark, sz = s.size();        int maxlen = 1;        for (i = 0; i < sz && 2 * (sz - i) > maxlen;)        {            a = b = i;            for (; b + 1 < sz && s[b] == s[b + 1]; ++b);            i = b + 1; //关键步骤,替代i += 1;            for (; a > 0 && b + 1 < sz && s[a - 1] == s[b + 1]; --a, ++b);            if (b - a + 1 > maxlen)            {                mark = a;                maxlen = b - a + 1;            }        }        return s.substr(mark, maxlen);    }

代码中间一步关键步骤使程序时间减少了很多,因为在b的那个循环中间,如果b有变化则代表b前面有相同的字符,此步骤跳过了那些重复的步骤,因为在相同的字符里面肯定是最大长度的一个子串,如aceeeecd,在这个步骤中,若使用i += 1;则当ab指向s[2]时,由于s中有重复e,因此b经过调整指向了最后一个e,得出最大子串ceeeec,然后i += 1;b还是指向最后一个e,这其中很多步骤都是相当在这个回文子串在找一个最大回文子串,因此不可能得出比刚才那个还要大的回文子串,故此处i = b+1;为关键步骤。

1 0
原创粉丝点击