• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c语言输出字符串中最大对称子串长度的3种解决方案

c语言输出字符串中最大对称子串长度的3种解决方案

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言字符串长度,c语言求字符串长度,c语言计算字符串长度,c语言字符串长度函数,c语言获取字符串长度等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

问题描述:

输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“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有关;

综上分析代码如下:

int FUN(char *inp){//求最大对称子串长度
        int maxlen = 1;//最大长度
        int len=strlen(inp);
        int record[len];//存包含该位及前个元素最长对称子串
        record[0]=1;
        int i=1;
        for(;i<len;i++){
                int max =1;
                if((i-record[i-1]-1)>=0 && inp[i] == inp[i-record[i-1]-1]){
                        max = max>(record[i-1] + 2)? max:(record[i-1] +2);
                }
                int k = 1;
                while(inp[i] == inp[i-k]){
                        k++;
                }
                max = max>k? max:k;
                record[i] = max;
         &nbs

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中函数返回字符串的方法汇总
  • C语言实现返回字符串函数的四种方法
  • 浅谈C语言之字符串处理函数
  • c语言中字符串分割函数及实现方法
  • C语言左旋转字符串与翻转字符串中单词顺序的方法
  • C语言中计算字符串长度与分割字符串的方法
  • 使用C语言提取子字符串及判断对称子字符串最大长度
  • c语言输出字符串中最大对称子串长度的3种解决方案
  • 基于C语言字符串函数的一些使用心得

相关文章

  • 2017-05-28详谈signed 关键字
  • 2017-05-28C++ 学习之旅 Windows程序内部运行原理
  • 2017-05-28C语言求圆周率的简单实现方法
  • 2017-05-28数据结构 数组顺序存储详细介绍
  • 2017-05-28C中实现矩阵乘法的一种高效的方法
  • 2017-05-28C语言中一些将字符串转换为数字的函数小结
  • 2017-05-28c语言二进制数按位输出示例
  • 2017-05-28如何利用tinyxml操纵xml及注意问题
  • 2022-04-30载入内存,让程序运行起来
  • 2017-05-28深入c语言continue和break的区别详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • php调用c++的方法
    • Linux c中define的用法小结
    • 通过C++程序示例理解设计模式中的外观模式
    • c++实现十进制转换成16进制示例
    • 引用参数和传值参数的区别深入解析
    • 如何用C语言生成简单格式的xml
    • 利用boost获取时间并格式化的方法
    • C++内核对象封装单实例启动程序的类
    • 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
    • 深入解析C++编程中的静态成员函数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有