最长回文数

1:题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)

2:题目分析

回文数是一种左右对称的字符串,如果从题目的背景一个大字符串出售,很容易使用暴力法,直接从1开始拓展成length-1长度,然后分别进行回文数判断,这种方法是最直接,最好想的,当然也是最消耗时间的。如果换个角度好好分析,回文数的特点我门可以通过找到对称中心的方式来进行找到回文数。

3:代码示例

3.1:暴力法

class Solution {
    public String longestPalindrome(String s) {
        //char[] c = new char[s.length()];
        //s.getChars(0,s.length(),c,0);
        int startIndex = 0;
        int charAmount = 0;
        int startIndexTemp = 0;
        int charAmountTemp = 0;
        for(int i=1;i<=s.length();i++){//从2开始,直到字符串长度的大小,极端情况可能一个最长的回文数就为本身
            char[] chars = new char[i];
            for(int j=0;j<s.length()-i+1;j++){//将字符串放在chars中,依次移动范围
                s.getChars(j,j+i,chars,0);
                //寻找之前保存原来的结果,
               for(int k =0;k<=chars.length/2;k++){
                    if(chars[k]==chars[chars.length-1-k]){
//                        startIndex = j;
//                        charAmount = i;
                        if(k==(chars.length/2)){
                            startIndex = j;
                            charAmount = i;
                        }
                        continue;
                    }
                    break;
                }
                if(charAmount==i){//则意味着已经找到了回文数,
                    break;//只要该长度找到一个回文数了,则直接break
                }
                else{//此处没有找到回文数,则向后移动位置,在继续寻找
                    continue;
                }
            }
        }

        return s.substring(startIndex,startIndex+charAmount);
    }
}

通过三次循环来暴力解决这个问题。第一层循环为控制回文字符串长度,以该长度来在目标字符串上进行判断,第二层循环了控制该固定长度的字符串在目标字符串上移动,第三层才为判断该字符串是不是回文字符串的。至此三层循环O(n^3)的时间复杂度,当然过不了leetcode时间要求。

3.2:中心展开法

由于所有回文字符串都是中心对称的,所以可以从中心点来作为出发点判断是不是回文字符串,则这种解决方式的O(n^2),因为第一次循环为遍历中心点,在n个字符串中,中心点有n+n-1个,可以是本字符为中心点也可以是两个字符中间为中心点!,算法思路为,先找到对称中心点,然后再以该中心分别向两边拓展来判断是不是回文数即可。

    //回文数可以是偶数长度,也可以是奇数长度
    //即可以是在一个字符处向右向左拓展,判断
    //或者是,从两个字符中间空位置开始向左向右判断
    //该方法来控制回文数的中心位置
    public String longestPalindrome(String s){
        String result = new String("");
        String tempString = null;
        for(int start = 0;start<s.length();start++) {
            String s1 = appendLength(s, start, start);//中心点再字符处
            String s2 = appendLength(s, start, start + 1);//中心点在两个字符之间
            tempString = s1.length()>=s2.length()?s1:s2;
            if(tempString.length()>result.length()){
                result = tempString;//若此次的结果长度大于上次的则保存此次!
            }
        }
        return result;
    }

    //以输入字符串和指定的起始位置向两边扩展来寻找回文字符串!
    public String appendLength(String s,int left,int right){
        int length=0;
        int l = left;
        int r = right;
        while(l>=0&&r<s.length()&&s.charAt(l)==s.charAt(r)){
            length = r-l+1;
            l--;
            r++;
        }
        return s.substring(l+1,r);//截取上面得到的回文字符串
    }

原文地址:https://www.cnblogs.com/dazhu123/p/12404319.html

时间: 2024-10-16 05:16:00

最长回文数的相关文章

回文数扩展--长字符串版

//回文数扩展 长字符串版 #include<iostream> #include<string> using namespace std; int main() { string str,s; cin>>str; int n=str.size(); for(int i=n-1;i>=0;i--) { s.push_back(str[i]); } if(str==s) { cout<<"是回文"<<endl; } els

习题-四季-回文数-不死神兔

1-键盘录入月份,输出对应的季节.一年有四季;3,4,5春季;6,7,8夏季;9,10,11秋季;12,1,2冬季 public class Demo02Test {     public static void main(String[] args) {         // 键盘录入一个月份,用Scanner实现         Scanner sc = new Scanner(System.in);         // 接收数据         System.out.println("请

洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes

P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”.例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就不是回文数. 事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数. 编

leetcode 5 :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, and there exists one unique longest palindromic substring. 翻译: 找出字符串s中最长的回文子串,字符串s的最长是1000,假设存在唯一的最长回文子串 法一:直接暴力破解 O(N3)的时间复杂度,运行超

用JS实现回文数的精准辨别!!!

笔者最近在一边看<JS高级程序设计3>一边在FCC上找题目练习啊.那叫一个爽.这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章"引用类型"搞定,FCC便知趣的给笔者来了个"回文数",笔者咬牙切齿,花了两天时间,又是研究数组,又是研究字符串,又是研究作用域,还看了很长时间的正则表达式.还好,不负有心人,嘿嘿嘿,现在为大家详细分享用JS实现精准回文数的辨别!!! 先给大家看几个类型的字符串: race car not a palindrome

求最长回文子串:Manacher算法

主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右对称的字符串,如:"abba",而最长回文子串则是字符串长度最长的回文子字符串,如"abbaca"的最长回文子串为"abba". 常规解法:显而易见采用嵌套循环的方式可以“暴力”结算出答案,其时间复杂度为O(n^2),而Manacher算法是一种更加

最长回文子串(Manacher算法)

回文字符串,想必大家不会不熟悉吧? 回文串会求的吧?暴力一遍O(n^2)很简单,但当字符长度很长时便会TLE,简单,hash+二分搞定,其复杂度约为O(nlogn), 而Manacher算法能够在线性的时间内处理出最长回文子串. 让我们来看道题:http://acm.hdu.edu.cn/showproblem.php?pid=3068 这个算法的巧妙之处,便是把奇数的回文串和偶数的回文串统一起来考虑了.这一点一直是在做回文串问题中时比较烦的地方.这个算法还有一个很好的地方就是充分利用了字符匹配

回文数系列题目(经典算法)

回文数 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 请寻找并输出1至1000000之间的数m,它满足m.m^2和m^3均为回文数.回文数大家都知道吧,就是各位数字左右对称的整数,例如121.676.123321等.满足上述条件的数如m=11,m^2=121,m^3=1331皆为回文数. 输入 没有输入 输出 输出1至1000000之间满足要求的全部回文数,每两个数之间用空格隔开,每行输出五个数 解析:这道题直接模拟就好了,算是回文数中最简单的题了,直接写个判断回

897B. Chtholly&#39;s request#长度为偶数的回文数(模拟)

题目出处:http://codeforces.com/problemset/problem/897/B 题目大意:构造一个题意要求的zcy数之后取模 #include<iostream> using namespace std; int main(){ int n,m; __int64 g,t,sum=0; cin>>n>>m; //关键在于zcy数的构造 //注意到要求长度是偶数 //考虑回文构造 for(int i=1;i<=n;i++){ g=i; t=i;