• 4 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.

    Example 1:

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

    Example 2:

     Input: "cbbd"
     Output: "bb"
    

    自己写的代码是用滑动窗口配合std::map构建的词典进行暴力检测,但是这样实在是太丑了,于是参考网上给的Java解法写了一个更漂亮的写法,不过这种算法虽然思路清晰简洁,运行速度却并不快(54%),神奇:)

    这种算法的基本思想是,如果已有一个回文字符串,并且这个回文字符串左右侧的临近字符相同,那么新的回文字符串可以通过向左向右各扩展一位得到。需要注意的是,扩展字符串的时候,其起始点既包含每个字符,也包含每个相邻字符的中间位置(比如 “abba”的起始扩展就应该在第二与第三个字符之间)。最终通过的代码如下:

    class Solution {
    public:
        string longestPalindrome(string s) {
            
            if(s.length()<=1) return s;
            
            int start  = 0;
            int maxLen = 0;
            
            for(int center=0;center<s.length();center++)
            {
                int len1,len2;
                
                len1 = expandAroundCenter(s,center,center);
                if((center+1)==s.length()) len2 = 1;
                else len2 = expandAroundCenter(s,center,center+1);
                int len  = (len1 > len2)? len1:len2;
                if(len > maxLen)
                {
                    maxLen = len;
                    start  = center - (len-1)/2;
                }
            }
            return s.substr(start,maxLen);
        }
        
        
        int expandAroundCenter(string s, int L, int R)
        {
            int len;
            
            while(L>=0&&R<s.length())
            {
                if(s[L] == s[R])
                {
                    len = R - L + 1; 
                    L--;
                    R++; 
                }
                else break;
                   
            }
            return len;
        }
        
    };
    
  • 相关阅读:
    POJ 3904 Sky Code (容斥原理)
    HDU 4334 Trouble (暴力)
    UVA 10325 The Lottery( 容斥原理)
    HDU 2841 Visible Trees 数论+容斥原理
    UVA11806-Cheerleaders(容斥原理+二进制)
    HDU1695 GCD (欧拉函数+容斥原理)
    HDU 5651 xiaoxin juju needs help (组合数)
    最大子矩阵和 51Nod 1051 模板题
    最大子段和 模板题 51Nod 1049
    51Nod 1006 最长公共子序列Lcs问题 模板题
  • 原文地址:https://www.cnblogs.com/xiaoyisun06/p/11161512.html
Copyright © 2020-2023  润新知