麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

最大對稱字符串的算法

2020-01-26 16:21:06
字體:
供稿:網(wǎng)友

算法一:O(n^3)

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


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

#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;
}

/*
 *查找最大對稱字串長度,時(shí)間復(fù)雜度是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)

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

#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ù)回文串了。
接下來就是算法的中心思想,用一個(gè)輔助數(shù)組P記錄以每個(gè)字符為中心的最長回文半徑,也就是P[i]記錄以Str[i]字符為中心的最長回文串半徑。P[i]最小為1,此時(shí)回文串為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]為中心的回文串在原串當(dāng)中的長度。
證明:
1、顯然L=2*P[i]-1即為新串中以Str[i]為中心最長回文串長度。
2、以Str[i]為中心的回文串一定是以#開頭和結(jié)尾的,例如“#b#b#”或“#b#a#b#”所以L減去最前或者最后的‘#'字符就是原串中長度的二倍,即原串長度為(L-1)/2,化簡的P[i]-1。得證。

注: 不是很懂, 自己改了

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

#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;
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 13一14毛片免费看 | 午夜在线视频一区二区三区 | av在线播放观看 | 欧美一级免费在线观看 | 国产成人在线综合 | 麻豆国产网站 | 一级黄色在线观看 | 热99视频 | 亚洲精品一区二区三区大胸 | 87成人免费看片 | 免费人成年短视频在线观看网站 | 欧美成网站 | 91成人免费在线视频 | 亚洲精品免费播放 | 国产亚洲自拍一区 | 亚洲婷婷日日综合婷婷噜噜噜 | 欧美成年性h版影视中文字幕 | 性少妇videosexfreexxx片 | 失禁高潮抽搐喷水h | 精品国产呦系列在线看 | 羞羞的| 国产一区免费在线 | 国产精品久久久久久久四虎电影 | 久久国产亚洲视频 | 欧美性生交xxxxx免费观看 | 一级黄色免费大片 | 九九热视频这里只有精品 | 超碰97国产在线 | 午夜色视频在线观看 | 国产精品99一区二区 | 亚洲精品xxx| 在线成人免费视频 | 高清在线国产 | 日日草天天干 | 色中色在线播放 | 欧美精品一区二区三区在线 | 国产99视频精品免视看9 | 国产91一区二区三区 | 免费专区 - 91爱爱 | 369看片你懂的小视频在线观看 | 久久精品亚洲精品国产欧美kt∨ |