每日OJ题_牛客_JOR26最长回文子串_C++_Java

目录

牛客_OR26最长回文子串

题目解析

C++代码1

C++代码2

Java代码


牛客_OR26最长回文子串

最长回文子串_牛客题霸_牛客网

描述:

对于长度为n的一个字符串A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。


题目解析

枚举所有的中心点,然后向两边扩散即可,也可用dp解决,回文串类型题目即解析:Offer必备算法21_回文串dp_六道力扣题详解(由易到难)-CSDN博客

C++代码1

dp解法代码:

cpp 复制代码
class Solution {
    public:
    /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param A string字符串
* @return int整型
*/
    int getLongestPalindrome(string A) {
        // dp[i][j]表示i位置为结尾,最外面的字符是j的回文串?
        // 暴力
        int sz = A.size();
        int ret = 1;
        for(int i = 0; i < sz; ++i)
        {
            int len = 1; // 前面的防止越界不加也过了
            if(i != 0 && i != sz - 1 && A[i - 1] == A[i + 1])
            {
                int left = i - 1, right = i + 1;
                while(left >= 0 && right < sz && A[left--] == A[right++])
                    len += 2;
            }
            // cout << len << endl;
            ret = max(ret, len);
            if(i != 0 && A[i - 1] == A[i])
            {
                len = 0;
                int left = i - 1, right = i;
                while(left >= 0 && right < sz && A[left--] == A[right++])
                    len += 2;
            }
            ret = max(ret, len);
            if(i != sz - 1 && A[i] == A[i + 1])
            {
                len = 0;
                int left = i, right = i + 1;
                while(left >= 0 && right < sz && A[left--] == A[right++])
                    len += 2;
            }
            ret = max(ret, len);
        }
        return ret;
    }
};

C++代码2

中心拓展解法代码:

cpp 复制代码
class Solution
{
    public:
    int getLongestPalindrome(string s)
    {
        int ret = 1, n = s.size();
        for(int i = 1; i < n; i++)
        {
            // 当⻓度是奇数的时候
            int left = i - 1, right = i + 1;
            while(left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            ret = max(ret, right - left - 1);
            // 当⻓度是偶数的时候
            left = i - 1, right = i;
            while(left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            ret = max(ret, right - left - 1);
        }
        return ret;
    }
};

Java代码

中心拓展解法代码:

cpp 复制代码
import java.util.*;
public class Solution
{
    public int getLongestPalindrome (String s)
    {
        // 中⼼扩展算法
        int n = s.length();
        int ret = 0;
        for(int i = 0; i < n; i++) // 枚举所有的中点
        {
            // 当⻓度为奇数的时候
            int left = i - 1, right = i + 1;
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right))
            {
                left--;
                right++;
            }
            ret = Math.max(ret, right - left - 1);
            // 当⻓度为偶数的时候
            left = i; right = i + 1;
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right))
            {
                left--;
                right++;
            }
            ret = Math.max(ret, right - left - 1);
        }
        return ret;
    }
}
相关推荐
独自破碎E9 小时前
【二分法】寻找峰值
算法
alonewolf_999 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子9 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34169 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
mit6.8249 小时前
位运算|拆分贪心
算法
ghie909010 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体110 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk99810 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
wszy180910 小时前
新文章标签:让用户一眼发现最新内容
java·python·harmonyos
Z1Jxxx10 小时前
加密算法加密算法
开发语言·c++·算法