欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c語言輸出字符串中最大對(duì)稱子串長(zhǎng)度的3種解決方案

 更新時(shí)間:2014年03月13日 16:41:01   作者:  
這篇文章主要介紹了c語言輸出字符串中最大對(duì)稱子串長(zhǎng)度的3種解決方案,需要的朋友可以參考下

問題描述:

輸入一個(gè)字符串,輸出該字符串中最大對(duì)稱子串的長(zhǎng)度。例如輸入字符串:“avvbeeb”,該字符串中最長(zhǎng)的子字符串是“beeb”,長(zhǎng)度為4,因而輸出為4。

解決方法:中序遍歷

一,全遍歷的方法:

1.全遍歷的方法,復(fù)雜度O(n3);

2.遍歷原字符串的所有子串,然后判斷每個(gè)子串是否對(duì)稱;

實(shí)現(xiàn)方法是:我們讓一個(gè)指針i從頭至尾遍歷,我們用另一個(gè)指針j從j=i+1逐一指向i后面的所有字符。就實(shí)現(xiàn)了原串的所有子串的遍歷(子串為指針i到j(luò)中間的部分);
最后判斷得到的子串是否對(duì)稱即可;

二,此外還有個(gè)巧妙的方法,值得和大家分享一下(這是自己想的哦,轉(zhuǎn)載請(qǐng)注明出處):

原串是str1=“avvbeeb”,將其翻轉(zhuǎn)得到str2=“beebvva”,然后錯(cuò)位比較:

1:               avvbeeb

str2:beebvva             (上下對(duì)齊的元素是a;a比較)

 

2:              avvbeeb

str2:beebvva           (上下對(duì)齊的量元素av;va比較,不對(duì)稱)

…………

11:              avvbeeb

str2:                  beebvva           (上下對(duì)齊的量元素beeb;beeb比較,得到最長(zhǎng)對(duì)稱子串)

…………

該方法要移動(dòng)m+n次,每次元素比較個(gè)數(shù)從1到m不等,復(fù)雜度O(n2);

 

三,最值得推薦的還是下面的方法,復(fù)雜度O(n):

(以下都是自己想的自己寫的,碼字實(shí)在辛苦,轉(zhuǎn)載請(qǐng)注明出處)

1.起始這道題分析起來非常扯淡,花了我兩天的空閑時(shí)間才搞定!

2.分析過程如下:

3. 1-k位的元素中,其中最長(zhǎng)對(duì)稱子串(包含第k位元素)長(zhǎng)度為f(n),我們討論f(n+1)與f(n)的關(guān)系;

4.比如 b xxx a其中xxx代表對(duì)稱子串,a為第n+1位元素,我們現(xiàn)在求f(n+1);

5.我們分析所有情況:(我們用xxx代表n位對(duì)稱子串)

          數(shù)組A存放字符數(shù)組;

          f(n)表示f(n)位元素對(duì)應(yīng)子串長(zhǎng)度;

   分析如下A[n+1]=a的子串長(zhǎng)度值f(n+1)值是多少:

   1:bxxxa  :A[n+1]位元素a與對(duì)稱子xxx串前的一位元素b不同時(shí);

     1.1: a與左相鄰元素不同,即xxx=bxb時(shí),bbxba不是對(duì)稱子串,f(n+1)=1;

     1.2: a與左相鄰元素相同,即xxx=axa時(shí),baxaa,如果是對(duì)稱子串,則x這個(gè)未知部分必須全部是a,即

            baaaa,f(n+1)=f(n)+1,否則不是對(duì)稱子串f(n+1)=1;

   axxxa  :A[n+1]位元素a與對(duì)稱子串前一位元素相同;

     2.這種情況f(n+1)位元素a與其左相鄰元素是否相同都不影響f(n+1)的結(jié)果,

        比如:a bacab a        a aaaaa a

        串長(zhǎng):1 13135 7        1 23456 7        也就是xxx不論是何種情況的對(duì)稱串,f(n+1)=f(n)+2;

 6.綜上分析,串A[n+1]位的值f(n+1)只和串中第A[n]位字符以及第A[n-f(n)-1]有關(guān);

    (5中分析的f(n+1)=1的情況可以忽略不考慮,因?yàn)樽钚?duì)稱子串值>=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

      此時(shí)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

      此時(shí)f(n+1)與它前面有幾個(gè)a有關(guān);

綜上分析代碼如下:

復(fù)制代碼 代碼如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int FUN(char *inp){//求最大對(duì)稱子串長(zhǎng)度
        int maxlen = 1;//最大長(zhǎng)度
        int len=strlen(inp);
        int record[len];//存包含該位及前個(gè)元素最長(zhǎng)對(duì)稱子串
        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;
                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 0;
}

輸出結(jié)果:

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • 十分鐘學(xué)會(huì)C++?Traits

    十分鐘學(xué)會(huì)C++?Traits

    本文試圖以最簡(jiǎn)潔的方式闡述對(duì)C++?traits?的理解,當(dāng)你理解了第二個(gè)例子的時(shí)候,相信你已經(jīng)理解了C++?traits,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-02-02
  • C++中vector和map的刪除方法(推薦)

    C++中vector和map的刪除方法(推薦)

    下面小編就為大家?guī)硪黄狢++中vector和map的刪除方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Objective-C限制函數(shù)調(diào)用的頻率詳解

    Objective-C限制函數(shù)調(diào)用的頻率詳解

    這篇文章主要給大家介紹了關(guān)于Objective-C限制函數(shù)調(diào)用的頻率的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 淺析C++如何跨模塊釋放內(nèi)存

    淺析C++如何跨模塊釋放內(nèi)存

    這篇文章主要為大家詳細(xì)介紹了C++中跨模塊釋放內(nèi)存的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-02-02
  • C語言枚舉(enum)和聯(lián)合(union)實(shí)例分享

    C語言枚舉(enum)和聯(lián)合(union)實(shí)例分享

    在本篇文章里小編給大家整理了關(guān)于C語言枚舉(enum)和聯(lián)合(union)實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 你只用do-while來實(shí)現(xiàn)循環(huán)?太浪費(fèi)了

    你只用do-while來實(shí)現(xiàn)循環(huán)?太浪費(fèi)了

    這篇文章主要介紹了你只用do-while來實(shí)現(xiàn)循環(huán)?太浪費(fèi)了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù)

    詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù)

    這篇文章主要介紹了詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C語言指針用法總結(jié)

    C語言指針用法總結(jié)

    本文詳細(xì)講解了C語言指針用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C++ Boost Exception超詳細(xì)講解

    C++ Boost Exception超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • Matlab 數(shù)字圖像的濾波及邊緣檢測(cè)

    Matlab 數(shù)字圖像的濾波及邊緣檢測(cè)

    本文運(yùn)用文字、代碼以及示例詳細(xì)介紹了數(shù)字圖像的濾波以及圖像的邊緣檢測(cè),需要的朋友可以自己了解一下
    2021-08-08

最新評(píng)論