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 <stdlib.h>
#include <stdio.h>
#include <string.h> int FUN(char *inp){//求最大对称子串长度
int maxlen = ;//最大长度
int len=strlen(inp);
int record[len];//存包含该位及前个元素最长对称子串
record[]=;
int i=;
for(;i<len;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
c语言:最长对称子串(3种解决方案)的更多相关文章
- L2-008. 最长对称子串
L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...
- 天梯赛L2-008 最长对称子串 (字符串处理)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- [刷题] PTA 7-64 最长对称子串
7-64 最长对称子串 我的代码: 1 #include<stdio.h> 2 #include<string.h> 3 #define N 1001 4 5 int main ...
- 团体程序设计天梯赛-练习集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 <iostream> 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. 输入格式: 输入在一 ...
随机推荐
- Jquery Jqprint—随着Jquery Jqprint实现网页打印
研究关于利用空闲时间今天Jquery Jqprint插入,用这个Jquery脚本就可以实现轻松打印指定的页面内容功能区: 样品A: <!DOCTYPE html PUBLIC "-// ...
- crawler_浅谈网络爬虫
题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...
- crawler_httpurlconnection_自动编码识别
核心思想: 1:从响应头中读取 [命中解流准确率最高] 2:如果响应头中没有,打开流从源码中读取,[取舍,如果有一般在前30行会有,前100行中寻找] 3:如果还没有,根据字节码code位置,字符识别 ...
- linux_ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机
使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机. ssh-keygen 创建公钥和密钥. ssh-copy-id 把本地主 ...
- 批处理获取IP地址
setlocal ENABLEEXTENSIONS & set "i=0.0.0.0" & set "j=" for /f "toke ...
- NPOI 的使用心得
Excel 数据 通过 c# 代码逻辑 导入 到数据库 . 其中各种坑爹.原因是 单元格 数据 与 数据库 字段的数据类型 会有出入.因为 Excel 是人工输入. 比如 一个单元格 本来 只能 ...
- C语言库函数大全及应用实例五
原文:C语言库函数大全及应用实例五 [编程资料]C语言库函数大全及应用实例五 函数名: getcurdi ...
- AngulaJS实战
AngulaJS实战总结, 带你进入AngularJS世界(待续) 使用AngularJS 进行Hybrid App 开发已经有一年多时间了,这里做一个总结. 一.AngularJS 初始化加载 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- centos6的安装
centos6的安装,一步一图,有图有真相 打开虚拟机VMware,点击文件,选择[新建虚拟机],如图所示