问题描述:
输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4。
解决方法:中序遍历
一,全遍历的方法:
1.全遍历的方法,复杂度O(n3);
2.遍历原字符串的所有子串,然后判断每个子串是否对称;
实现方法是:我们让一个指针i从头至尾遍历,我们用另一个指针j从j=i+1逐一指向i后面的所有字符。就实现了原串的所有子串的遍历(子串为指针i到j中间的部分);
最后判断得到的子串是否对称即可;
二,此外还有个巧妙的方法,值得和大家分享一下(这是自己想的哦,转载请注明出处):
原串是str1=“avvbeeb”,将其翻转得到str2=“beebvva”,然后错位比较:
1: avvbeeb
str2:beebvva (上下对齐的元素是a;a比较)
2: avvbeeb
str2:beebvva (上下对齐的量元素av;va比较,不对称)
…………
11: avvbeeb
str2: beebvva (上下对齐的量元素beeb;beeb比较,得到最长对称子串)
…………
该方法要移动m+n次,每次元素比较个数从1到m不等,复杂度O(n2);
三,最值得推荐的还是下面的方法,复杂度O(n):
(以下都是自己想的自己写的,码字实在辛苦,转载请注明出处)
1.起始这道题分析起来非常扯淡,花了我两天的空闲时间才搞定!
2.分析过程如下:
3. 1-k位的元素中,其中最长对称子串(包含第k位元素)长度为f(n),我们讨论f(n+1)与f(n)的关系;
4.比如 b xxx a其中xxx代表对称子串,a为第n+1位元素,我们现在求f(n+1);
5.我们分析所有情况:(我们用xxx代表n位对称子串)
数组A存放字符数组;
f(n)表示f(n)位元素对应子串长度;
分析如下A[n+1]=a的子串长度值f(n+1)值是多少:
1:bxxxa :A[n+1]位元素a与对称子xxx串前的一位元素b不同时;
1.1: a与左相邻元素不同,即xxx=bxb时,bbxba不是对称子串,f(n+1)=1;
1.2: a与左相邻元素相同,即xxx=axa时,baxaa,如果是对称子串,则x这个未知部分必须全部是a,即
baaaa,f(n+1)=f(n)+1,否则不是对称子串f(n+1)=1;
axxxa :A[n+1]位元素a与对称子串前一位元素相同;
2.这种情况f(n+1)位元素a与其左相邻元素是否相同都不影响f(n+1)的结果,
比如:a bacab a a aaaaa a
串长:1 13135 7 1 23456 7 也就是xxx不论是何种情况的对称串,f(n+1)=f(n)+2;
6.综上分析,串A[n+1]位的值f(n+1)只和串中第A[n]位字符以及第A[n-f(n)-1]有关;
(5中分析的f(n+1)=1的情况可以忽略不考虑,因为最小对称子串值>=1)
1: A[n+1]和A[n-f(n)-1]相同;
a xxx x a :acca aaaa acdca
A[n-f(n)-1] A[n] A[n+1]
f(n) f(n+1) :1124 1234 11134
此时f(n+1)=f(n)+2;
2: A[n+1]和A[n-f(n)-1]不同;A[n+1]和A[n]相同;
如: b xxx a a :bcacaa baaaaa
A[n-f(n)-1] A[n] A[n+1] :111332 112345
此时f(n+1)与它前面有几个a有关;
综上分析代码如下:
#include
#include
#include
int FUN(char *inp){//求最大对称子串长度
int maxlen = ;//最大长度
int len=strlen(inp);
int record[len];//存包含该位及前个元素最长对称子串
record[]=;
int i=;
for(;i
int max =;
if((i-record[i-]-)>= && inp[i] == inp[i-record[i-]-]){
max = max>(record[i-] + )? max:(record[i-] +);
}
int k = ;
while(inp[i] == inp[i-k]){
k++;
}
max = max>k? max:k;
record[i] = max;
printf("----- is:%d\n",record[i]);
if(record[i]>maxlen) maxlen=record[i];
}
return maxlen;
}
int main(){
char *input="abadddkeipdldlfk";
int retlen = FUN(input);//从前向后递归
printf("max length is:%d\n",retlen);
return ;
}
输出结果:
xu@xu-ThinkPad-X61:~/algorithm$ gcc LongSunmetricSub.c
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
----- is:1
----- is:3
----- is:1
----- is:2
----- is:3
----- is:1
----- is:1
----- is:1
----- is:1
----- is:1
----- is:1
----- is:3
----- is:1
----- is:1
----- is:1
max length is:3
L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
天梯赛L2-008 最长对称子串 (字符串处理)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
团体程序设计天梯赛-练习集L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
L2-008 最长对称子串 (25 分) (模拟)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376 题目: 对给定的字符串,本题要求你输出 ...
L2-008. 最长对称子串(思维题)*
L2-008. 最长对称子串 参考博客 #include using namespace std; int main() { string s; getline(ci ...
pat 团体赛练习题集 L2-008. 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
L2-008 最长对称子串 (25 分)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
PAT L2-008 最长对称子串(模拟字符串)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
天梯杯 L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
随机推荐
表中排序ID断开重排
客户需要排序ID和页面的问题序号一致,以前删除过一些问题导致order_id 中间有些断开的. 业务表 T_QUESTION order_id question_id custom_id --1.创 ...
request, session, application辨析(待更新)
作用域 request < session < application 分析 1. request 只在一次请求中有效,当请求发送变化时,信息将失效. 2. session 在当前一次会话 ...
BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
C#初始化数组的三种方式
C#声明数组并初始化,有三种方式. 对于一维数组: using System;using System.Data;using System.Configuration;using System.Web ...
BZOJ3297: [USACO2011 Open]forgot
3297: [USACO2011 Open]forgot Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 54 Solved: 38[Submit][ ...
hdu3715
hdu3715 题意 给出一个递归的伪代码,当 x[a[dep]] + x[b[dep]] != c[dep],就向下递归,给出a,b,c数组的值 问 dep 最大多少.其中 0 <= c[i] ...
python面试题一个字符串是否由重复的子字符串组成
一,给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 输入: "abab" 输出: True 解释: 可由 ...
一天一个Linux命令--find
文件查找:(以find为主) which:查找命令字所在的位置 locate:模糊匹配(只要包含关键字的文件都查找出来) 不是实时的,基于数据库查找, updatedb升级loca ...
[2017BUAA软工助教]案例分析小结
BUAA案例分析小结 一.作业要求 http://www.cnblogs.com/jiel/p/7631784.html 二.统计数据 总人数 神策数据 博客园博客 必应词典 30 1 12 17 三 ...
linux kernel的cmdline参数解析原理分析【转】
转自:https://blog.csdn.net/skyflying2012/article/details/41142801 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. htt ...