当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-24

    本文导语:  问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“avvbeeb”,该字符串中最长的子字符串是“beeb”,长度为4,因而输出为4。 解决方法:中序遍历 一,全遍历的方法: 1.全遍历的方法,复...

问题描述:

输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“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 = 1;//最大长度
        int len=strlen(inp);
        int record[len];//存包含该位及前个元素最长对称子串
        record[0]=1;
        int i=1;
        for(;i=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;
                printf("----- is:%dn",record[i]);
                if(record[i]>maxlen) maxlen=record[i];
        }
        return maxlen;
}

int main(){
        char *input="abadddkeipdldlfk";
        int retlen = FUN(input);//从前向后递归
        printf("max length is:%dn",retlen);
        return 0;
}

输出结果:

代码如下:

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

    
 
 

您可能感兴趣的文章:

  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • C语言字符串库 AString
  • c语言 字符串函数 子串
  • C语言字符串处理库 cstring
  • C语言中的字符串拼接问题,怎么得不到我想要的字符串?
  • C语言字符串函数库 Strfunc
  • c语言有什么简单办法判断一个字符串是否是合法日期?
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • c语言中如何通过日期时间字符串得到时间戳?
  • 如何用C语言去除字符串两边的空字符
  • Linux下C语言怎么把长整型转换为字符串
  • Linux下的C语言字符串和字符有几种类型?和Windows下区别是不是很大?
  • linux下c语言字符串数据类型的问题!
  • c语言 字符串转大写的简单实例
  • Linux c语言 如何统计utf-8编码的包含中英文和各种符号的字符串中各个字符的个数
  • c语言中用字符串数组显示菜单的解决方法
  • C语言字符串原地压缩实现方法
  • C语言中字符串和数字的相互转换实现代码
  • c语言中time_t类型是一个长整型,java中的字符串"YYYY-MM-DD HH:MM:SS"怎么转换为这个长整型?
  • 用c语言根据可变参数合成字符串的实现代码
  • 非常着急,关于DES加密的,用java加密过的字符串,药用Linux下的C语言来解密,涉及到补位的问题,弄了几天都没有实现,有高手会的,请指点一二!!!!!!!!
  • 请教如何用c语言在linux下实现检查某一用户密码长度?
  • 各位大虾:请问UNIX环境下C语言函数memcpy拷贝的字符的长度有没有限制,若有,能不能修改,怎么修改?
  • 关于几种 c语言内部数据类型的 字节长度
  • C语言安全之数组长度与指针实例解析
  • C语言指针的长度和类型深入分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HTML语言特殊字符大全及其编码对照表(包括转义方式)
  • 改变redhat的系统语言/字符集
  • 关于ubuntu字符界面系统console显示多国语言
  • 如何改变redhat的系统语言/字符集
  • c语言标准库中字符转换函数和数字转换函数
  • 深入C语言把文件读入字符串以及将字符串写入文件的解决方法
  • Linux下C语言怎样从键盘读入一个十六进制字符数组
  • C语言中字符串常用函数strcat与strcpy的用法介绍
  • c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)
  • c语言字符数组与字符串的使用详解
  • 基于C语言字符串函数的一些使用心得
  • C语言切割多层字符串(strtok_r strtok使用方法)
  • C语言实现字符串匹配KMP算法
  • ubuntu下初学用C语言实现find,好像有字符的问题
  • C语言字符串操作总结大全(超详细)
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • c语言实现MD5算法完整代码示例
  • 动态编程语言 LIME编程语言
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • C语言如何改变当前语言环境
  • c语言基于libpcap实现一个抓包程序过程
  • 如何在VIM中使汇编语言和C语言自动缩进?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3