C实现 LeetCode->Longest Palindromic Substring

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.


回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我


最长回文子串的长度


题目描述


给定一个字符串,求它的最长回文子串的长度。


分析与解法


最容易想到的办法是枚举所有的子串,分别判断其是否为回文。这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包含另一个短一些的子串,那么对子串的回文判断其实是不需要的。


解法一


那么如何高效的进行判断呢?借鉴KMP算法的做法,既然对短的子串的判断和包含它的长的子串的判断重复了,我们何不复用下短的子串的判断呢,即让短的子串的判断成为长的子串的判断的一个部分。


没错,扩展法。从一个字符开始,向两边扩展,看看最多能到多长,使其保持为回文。




C实现 LeetCode->Longest Palindromic Substring_第1张图片





//
//  LongestPalindromicSubstring.c
//  Algorithms
//
//  Created by TTc on 15/6/6.
//  Copyright (c) 2015年 TTc. All rights reserved.
//

#include "LongestPalindromicSubstring.h"
#include <string.h>
#include <stdlib.h>


/**
 *  内层的两个 for 循环,它们分别对于以 i 为中心的,长度为奇数和偶数的两种情况,整个代码遍历中心位置 i 并以之扩展,找出最长的回文。
 */
char *
longestPalindrome(char* s) {
    int middle = 0;
    int n = strlen(s);
    int i, j, max;
    if (s == 0 || n < 1) return 0;
    max = 0;
    for (i = 0; i < n; ++i) { // i is the middle point of the palindrome
        for (j = 0; (i-j >= 0) && (i+j < n); ++j) // if the lengthof the palindrome is odd
            if (s[i-j] != s[i+j])
                break;
        if (j*2-1 > max){
            max = j * 2 - 1;
            middle = i;
        }
        for (j = 0; (i-j >= 0) && (i+j+1 < n); ++j) // for theeven case
            if (s[i-j] != s[i+j+1])
                break;
        if (j*2 > max){
            max = j * 2;
            middle = i;
        }
    }
    int padding = (max - 1)/2 ;
    int start = middle - padding;
    //    int end = middle + padding;
    //    printf("middle==%d  pad==%d start==%d  end==%d \n",middle,padding,start,end);
    char *result = NULL;
    result = (char*)malloc(sizeof(char)*(max + 1));
    memcpy(result, s + start, max);
    result[max] = '\0';
    return result;
}



void
test_longestPalindrome(){
    char s[1000] ="11aabaa";
    char *max_s = longestPalindrome(s);
    printf("max_s===%s \n",max_s);
    //    int max = longestPalindrome(s);
    //    printf("max===%d",max);
}


你可能感兴趣的:(C实现 LeetCode->Longest Palindromic Substring)