zoukankan      html  css  js  c++  java
  • (十一)字符串【C++刷题】

    最长回文子串

    Leetcode:5,https://leetcode-cn.com/problems/longest-palindromic-substring/)

    1.问题描述

    给定一个字符串s,找到s中最长的回文子串。【回文串:正着读和反着读都一样】

    2.输入输出

    • Input:s = "babad"
    • Output:"bab"

    3.算法分析

    从中心点往两边扩散,来寻找回文串,这种方式相当于穷举每一个点为中心点。若回文串是奇数,则中心点只有一个;若回文串是偶数,则中心点有两个。即先确定中心点后去找回文串,将每次找到的回文串与之前的做对比,留下最长的。

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

    4.编程实现

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Solution {
    public:
        string longestPalindrome(string s) {
            int len = s.size();
            if (len < 2) return s;
            int start = 0, maxlen = 1, mid = 0;
            
            while (mid < len) {  // 穷举每个中心点
                int mid_start = mid, mid_end = mid;
                
                while (mid_end+1 < len && s[mid_end] == s[mid_end+1]) mid_end++;
                mid = mid_end+1;
                
                int left = mid_start, right = mid_end;
                while (left-1 >= 0 && right+1 < len && s[left-1] == s[right+1]) {
                    left--;
                    right++;
                }
                
                int curlen = right - left + 1;
                if (curlen > maxlen) {
                    maxlen = curlen;
                    start = left;
                }
            }
            
            return s.substr(start, maxlen);
        }
    };
    
    int main() {
        Solution sol;
        string s;
        cin >> s;
        
        cout << sol.longestPalindrome(s) << endl;
        return 0;
    }
    
    本文为博主原创文章,未经博主允许禁止转载,需转载请注明出处,欢迎指正!
  • 相关阅读:
    luogu P3804 【模板】后缀自动机 (SAM)
    莫队
    luogu P4688 [Ynoi2016]掉进兔子洞
    FZOJ 2331 LYK loves graph
    字典树
    luogu P6623 [省选联考 2020 A 卷] 树
    luogu P6018 [Ynoi2010]Fusion tree
    luogu P3264 [JLOI2015]管道连接
    最小斯坦纳树
    9. 回文数
  • 原文地址:https://www.cnblogs.com/caoer/p/15722443.html
Copyright © 2011-2022 走看看