最长回文子串

题目描述:
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。

所谓回文串,指左右对称的字符串。

所谓子串,指一个字符串删掉其部分前缀和后缀(也可以不删)的字符串

(注意:记得加上while处理多个测试用例)

输入描述:
输入一个仅包含小写字母的字符串

输出描述:
返回最长回文子串的长度

示例:
输入:

复制
cdabbacc
输出:

复制
4
说明:

复制
abba为最长的回文子串

解题思路:
这题用双循环解决。从头开始一层遍历,从后开始一层遍历;
每个节点,令m=i,n=j,当某个位置str[m]与str[n]相等时进入while循环,m++、n–,
同时用t记录回文一半长度的尺寸,若为回文则到中间位置,m会大于等于n;
如果m   和n相等,说明回文字符数为奇数,则回文长度为2*t+1,若m>n,说明回文字符数为偶数,
则回文长度为2*t,同时更新max,max为最长回文长度。'

测试代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    string str;
    while(getline(cin,str))
    {
        int max=0;
        int size=str.size();
        for(int i=0;i<size;++i)
        {
            for(int j=str.size()-1;j>i;--j)
            {
                int m=i,n=j,t=0;
                while(str[m]==str[n])
                {
                    t++;
                    m++;
                    n--;
                    if(m>=n)
                    {
                        if(m==n)
                            t=2*t+1;
                        else
                            t=2*t;
                        if(t>max)
                            max=t;
                        break;
                    }
                }
            }
        }
        cout<<max<<endl;
    }
    return 0;
}

python的解法
第一步应该去除原字符串内的特殊字符得到一个只含有字母的字符串

第二步就是进行纯字母字符串中回文子串的挑选

将指定的回文字符串挑选出来还需要进行原样输出

所以应记录一下子串首尾字符在原字符串中的坐标。

可以定义一个数组长度与纯字母子串一样长。在进行筛选空白字符的时候记录该字符在原串的索引

代码实现
先上运行结果:
在这里插入图片描述

C语言风格实现

import sys
mystr=sys.stdin.readline().strip()
charr=""
charri=[]
mymax=-1
x=0
y=0
flag=True
 
j=-1
for i in mystr:
    j+=1
    if ord(i)<65 or ord(i)>122:
        continue
    else:
        charr+=i
        charri.append(j)
charr=charr.lower()
 
#print(charr,charri)
i=0
while i<len(charr):
    j=i
    while j<len(charr):
        k=i
        while k<=j:
            if charr[k]!=charr[i+j-k]:
                flag=False
                break
            k+=1
        if flag:
            if mymax<j-i+1:
                mymax=j-i+1
                x=i
                y=j
        flag=True
        j+=1
    i+=1
 
print("第一种实现方式:")
print(x,y)
print(mystr[charri[x]:charri[y]+1:])

python风格实现

import sys
mstr=sys.stdin.readline().strip()
 
tstr=""
snum=[]
smax=0
x=0
y=0
j=0
for i in mstr:
    if ord(i)>=65 and ord(i)<=122:
        tstr+=i
        snum.append(j)
    j+=1
 
tstr=tstr.lower()
 
for i in  range(len(tstr)):
    for j in range(i,len(tstr)+1):
        if tstr[i:j]==tstr[i:j][::-1] and len(tstr[i:j])>smax:
            smax=len(tstr[i:j])
            x=i
            y=j
print("第二种实现:")
print(x,y)
print(mstr[snum[x]:snum[y-1]+1])

这里使用了两种实现方式,一种是c语言风格一种是Python 两者主要区别就是Python可能会有一些库方便进行判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值