leetcodeアルゴリズム練習問題 - 最長の回文構造部分文字列(C言語)

問題の1説明

文字列S Aを考えると、あなたにより部分でパリンドローム最長を探すには1000の上で月がS.ていると仮定することを最大の長さS
例1:
入力:「Babad」
出力:「BAB」
注:「ABA」は、有効な答えである
例2:
入力: "cbbd"
出力: "BB"
ソース:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/longest-palindromic-substring
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

第一の方法:動的プログラミング

次の記事を参照してください
https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

char * longestPalindrome(char * s){
    char d[1000][1000] ={0};
    int i,j,curlen,start=0,maxlen=1;
    int length = strlen(s);
    for(j=1; j<length; j++){
        for(i=0; i<j; i++){
            if(s[i]==s[j])
                if(j-i<3)
                    d[i][j] = 1;
                else
                    d[i][j] = d[i+1][j-1];
            if(d[i][j]){
                curlen = j-i+1;
                if(curlen > maxlen){
                    maxlen = curlen;
                    start = i;
                }
            }
        }
    }
    if(length==0)
        maxlen = 0;
    *(s+start+maxlen) = 0;
    return s+start;
}

ここに画像を挿入説明

第二の方法:センター拡散法

void longestPart(char* s, int length, int left, int right, int* maxlen, int* start){
    int curlen;
    while(left >=0 && right<length){
            if(s[left]==s[right]){
                curlen =right-left+1;
                if(curlen > *maxlen){
                    *maxlen = curlen;
                    *start = left;
                }
                left--;
                right++;
            }
            else
                break;
            
    }
}
char * longestPalindrome(char * s){
    int i,start=0,maxlen=1;
    int length = strlen(s);
    for(i=0; i<length; i++){
        longestPart(s,length,i-1,i+1,&maxlen,&start);
    }
    for(i=0; i<length; i++){
        longestPart(s,length,i,i+1,&maxlen,&start);
    }   
    if(length==0)
        maxlen=0;  
    *(s+start+maxlen) = 0;
    

ここに画像を挿入説明

リリース6元記事 ウォンの賞賛0 ビュー135

おすすめ

転載: blog.csdn.net/weixin_38072112/article/details/103979924