最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最大對稱字符串的算法

 更新時間:2013年03月06日 15:43:03   作者:  
題目:輸入一個字符串,輸出該字符串中對稱的子字符串的最大長度。比如輸入字符串“google”,由于該字符串里最長的對稱子字符串是“goog”,因此輸出4。

算法一:O(n^3)

判斷字串是否對稱是從外到里, O(n)


復制代碼 代碼如下:

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

/*
 *判斷起始指針,到結(jié)束指針的字符串是否對稱
 */
int IsSymmetrical(char* pBegin, char* pEnd)
{
    if(pBegin == NULL || pEnd == NULL || pBegin > pEnd)
    return 0;

    while(pBegin < pEnd)
    {
    if(*pBegin != *pEnd)
        return 0;
    pBegin++;
    pEnd--;
    }
    return 1;
}

/*
 *查找最大對稱字串長度,時間復雜度是O(n^3)
 */
int GetLongestSymmetricalLength(char* pString)
{
    if(pString == NULL)
    return 0;
    int symmetricalLength = 1;
    char* pFirst = pString;
    int length = strlen(pString);

    while(pFirst < &pString[length-1])
    {
    char* pLast = pFirst + 1;
    while(pLast <= &pString[length-1])
    {
        if(IsSymmetrical(pFirst, pLast))
        {
        int newLength = pLast - pFirst + 1;
        if(newLength > symmetricalLength)
            symmetricalLength = newLength;
        }
        pLast++;
    }
    pFirst++;
    }
    return symmetricalLength;
}

int main()
{
    char* str = "google";
    int len = GetLongestSymmetricalLength(str);
    printf("%d", len);
    return 0;
}


算法2: O(n^2)

判斷字串是否對稱是從外到里, O(1)

復制代碼 代碼如下:

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


int GetLongestSymmetricalLength(char* pString)
{
    if(pString == NULL)
    return 0;
    int symmetricalLength = 1;

    char* pChar = pString;
    while(*pChar != '\0')
    {
    //奇數(shù)長度對稱, 如 aAa
    char* left = pChar - 1;
    char* right = pChar + 1;
    while(left >= pString && *right != '\0' && *left==*right)
    {
        left--;
        right++;
    }
    int newLength = right - left - 1;   //退出循環(huán)是*left!=*right
    if(newLength > symmetricalLength)
        symmetricalLength = newLength;

    //偶數(shù)長度對稱, 如 aAAa
    left = pChar;
    right = pChar + 1;
    while(left >= pString && *right != '\0' && *left==*right)
    {
        left--;
        right++;
    }
    newLength = right - left - 1;   //退出循環(huán)是*left!=*right
    if(newLength > symmetricalLength)
        symmetricalLength = newLength;

    pChar++;
    }

    return symmetricalLength;
}

int main()
{
    char* str = "google";
    int len = GetLongestSymmetricalLength(str);
    printf("%d", len);
    return 0;
}

算法3:manacher算法

 原串:abaab
新串:#a#b#a#a#b#
這樣一來,原來的奇數(shù)長度回文串還是奇數(shù)長度,偶數(shù)長度的也變成以‘#'為中心的奇數(shù)回文串了。
接下來就是算法的中心思想,用一個輔助數(shù)組P記錄以每個字符為中心的最長回文半徑,也就是P[i]記錄以Str[i]字符為中心的最長回文串半徑。P[i]最小為1,此時回文串為Str[i]本身。
我們可以對上述例子寫出其P數(shù)組,如下
新串: # a # b # a # a # b #
P[]  :  1 2 1 4 1 2 5 2 1 2 1
我們可以證明P[i]-1就是以Str[i]為中心的回文串在原串當中的長度。
證明:
1、顯然L=2*P[i]-1即為新串中以Str[i]為中心最長回文串長度。
2、以Str[i]為中心的回文串一定是以#開頭和結(jié)尾的,例如“#b#b#”或“#b#a#b#”所以L減去最前或者最后的‘#'字符就是原串中長度的二倍,即原串長度為(L-1)/2,化簡的P[i]-1。得證。

注: 不是很懂, 自己改了

復制代碼 代碼如下:

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

int GetLongestSymmetricalLength(char* pString)
{
    int length = strlen(pString);
    char* pNewString = malloc(2*length+2);
    int i;
    for(i=0; i<length; i++)
    {
    *(pNewString+i*2) = '#';
    *(pNewString+i*2+1) = *(pString+i);
    }
    *(pNewString+2*length) = '#';
    *(pNewString+2*length+1) = '\0';

    printf("%s\n", pNewString);
    int maxLength = 1;
    char* pChar;
    for(i=0; i<2*length+2; i++)
    {
    int newLength = 1;
    pChar = pNewString + i;
    char* left = pChar-1;
    char* right = pChar+1;
    while(left>=pNewString && *right!='\0'&& *left==*right)
    {
        left--;
        right++;
        newLength++;
    }
    if(newLength > maxLength)
        maxLength = newLength;
    }

    return maxLength-1;
}

int main()
{
    char* str = "google";
    int len = GetLongestSymmetricalLength(str);
    printf("%d", len);
    return 0;
}

相關(guān)文章

  • C++11中內(nèi)聯(lián)函數(shù)(inline)用法實例

    C++11中內(nèi)聯(lián)函數(shù)(inline)用法實例

    內(nèi)聯(lián)函數(shù)本質(zhì)還是一個函數(shù),但在聲明的時候,函數(shù)體要和聲明結(jié)合在一起,否則編譯器將它作為普通函數(shù)來對待,下面這篇文章主要給大家介紹了關(guān)于C++11中內(nèi)聯(lián)函數(shù)(inline)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • C++中基本的輸入輸出函數(shù)使用指南

    C++中基本的輸入輸出函數(shù)使用指南

    這篇文章主要介紹了C++中基本的輸入輸出函數(shù)使用指南,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++ std::list的merge()使用方式與分析

    C++ std::list的merge()使用方式與分析

    這篇文章主要介紹了C++ std::list的merge()使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C/C++ 常用排序算法整理匯總分享

    C/C++ 常用排序算法整理匯總分享

    排序算法,就是如何使得記錄按照要求排列的方法。排序算法在很多領(lǐng)域得到相當?shù)刂匾?,尤其是在大量?shù)據(jù)的處理方面。一個優(yōu)秀的算法可以節(jié)省大量的資源。本篇整理了c語言和c++的常用的排序算法,感興趣的朋友可以參考下
    2021-06-06
  • C語言版約瑟夫問題算法實現(xiàn)

    C語言版約瑟夫問題算法實現(xiàn)

    大家好,本篇文章主要講的是C語言版約瑟夫問題算法實現(xiàn),感興趣的同學趕快來看一看吧,對你又幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++隱式類型轉(zhuǎn)換運算符operator type()用法詳解

    C++隱式類型轉(zhuǎn)換運算符operator type()用法詳解

    這篇文章主要介紹了C++隱式類型轉(zhuǎn)換運算符operator type()用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 深入解析C語言中typedef的四個用途

    深入解析C語言中typedef的四個用途

    以下是對C語言中typedef的四個用途進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言實現(xiàn)動態(tài)開辟存儲楊輝三角

    C語言實現(xiàn)動態(tài)開辟存儲楊輝三角

    這篇文章主要介紹了如何利用C語言實現(xiàn)動態(tài)開辟存儲楊輝三角,可以靈活的開辟空間,充分的利用空間。文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2022-03-03
  • C++中l(wèi)ist的用法實例講解

    C++中l(wèi)ist的用法實例講解

    list是順序容器的一種,list是一個雙向鏈表,使用list需要包含頭文件list,這篇文章主要給大家介紹了關(guān)于C++中l(wèi)ist的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • 使用單鏈表實現(xiàn)多項式計算示例

    使用單鏈表實現(xiàn)多項式計算示例

    這篇文章主要介紹了使用單鏈表實現(xiàn)多項式計算示例,需要的朋友可以參考下
    2014-03-03

最新評論

武夷山市| 泽普县| 云安县| 岳西县| 桑日县| 汕尾市| 常山县| 北辰区| 常宁市| 河北区| 安国市| 绵阳市| 天气| 全椒县| 安溪县| 韩城市| 金溪县| 清水河县| 聊城市| 厦门市| 扎兰屯市| 铁岭市| 盖州市| 达孜县| 玉溪市| 鲁山县| 定襄县| 大新县| 祁门县| 青川县| 云和县| 彭山县| 会昌县| 普定县| 玉环县| 汤阴县| 乌恰县| 江津市| 那坡县| 南郑县| 镇平县|