最长字符子串c语言,c语言:最长对称子串(3种解决方案)

问题描述:

输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“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&colon; &lbrack;Usaco2007 Feb&rsqb;Cow Sorting牛排序

Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...

C&num;初始化数组的三种方式

C#声明数组并初始化,有三种方式. 对于一维数组: using System;using System.Data;using System.Configuration;using System.Web ...

BZOJ3297&colon; &lbrack;USACO2011 Open&rsqb;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 ...

&lbrack;2017BUAA软工助教&rsqb;案例分析小结

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 ...

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值