zoukankan      html  css  js  c++  java
  • Leetcode 5

    题目:
    给定一个字符串,找出其最长的回文子串
    

    所谓回文,即正反两个方向读结果是一致的。举两个例子

    "aba"
    "abba"
    

    这两个例子代表着回文的奇偶两种形式,对后文的算法也有影响。

    在诸多求解这个问题的算法中,个人认为最容易理解,同时性能也较好的是中心扩展法,即:

    依次以字符串每一个位置为中心,向两侧扩展,直到两侧字符不同。

    要注意两点:

    1. 需要考虑奇偶两种情况。
    2. 对空串单独考虑

    以下为C++代码实现

    class Solution {
    public:
        int searchAround(string& s, int i, int j){
            int cnt = 0;
            while(i > 0 && j < s.size()-1){
                if(s[--i] == s[++j]){
                    cnt++;
                } else {
                    return cnt;
                }
            }
            return cnt;
        }
    
        // 中心扩展法
        string longestPalindrome1(string s) {
            if (s == "") return "";
            int sstart = 0;
            int slen = 1;
            for(int i=0; i < s.size(); ++i){
                int half = searchAround(s, i, i);
                int l1 = 2 * half + 1;
                if (l1 > slen){
                    sstart = i - half;
                    slen = l1;
                }
            }
    
            for(int i=0; i < s.size()-1; ++i){
                if(s[i] == s[i+1]){
                    int half = searchAround(s, i, i+1);
                    int l1 = 2 * half + 2;
                    if (l1 > slen){
                        sstart = i - half;
                        slen = l1;
                    }
                }
                
            }
            return s.substr(sstart, slen);
        }
    };
    

    在代码中做了两轮循环,分别考虑奇偶两种情况。searchAround函数会返回单侧的最大长度half,因此,对奇数情况的子串长度为2 * half + 1,对偶数情况的子串长度为2 * half + 2,子串起点均为i-half

  • 相关阅读:
    Execution Context(EC) in ECMAScript
    Prototype Chain
    一次websocket的抓包体验
    nodejs 解析 base64 文本
    curl常用命令行总结
    nodejs stream基础知识
    typedarrays splice
    nodejs stream & buffer 互相转换
    nodejs buffer 总结
    ajax stream 一边下载二进制数据一边处理
  • 原文地址:https://www.cnblogs.com/ben-future/p/palindromic.html
Copyright © 2011-2022 走看看