美文网首页
5. 最长回文子串

5. 最长回文子串

作者: yahibo | 来源:发表于2019-03-13 17:50 被阅读0次

难度:中等
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: “cbbd"
输出: “bb"

Java实现:

public class topic5 {
    public static void main(String[] args) {
        String s = "abcdbbfcba";
        String result = longestPalindrome(s);
        System.out.println(result);
    }
    public static String longestPalindrome(String s) {
        if(s==null||s.length()==0)return "";
        int start=0,end=0;
        for(int i=0;i<s.length();i++) {
            int len1 = expandCenter(s,i,i);
            int len2 = expandCenter(s,i,i+1);
            int len = len1>len2?len1:len2;
            if(len>(end-start)) {
                start = i-(len-1)/2;
                end = start+len;
            }
        }
        String str = s.substring(start, end);
        return str;
    }
    public static int expandCenter(String s, int left, int right) {
        int l = left;
        int r = right;
        while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
            l--;
            r++;
        }
        return r - l - 1;
    }
}

C语言实现:

//反回字符串长度
int expandCenter(char*s, int left, int right);
char* longestPalindrome(char* s);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        char* string  = "bb";
//        char* string  = "abacdfgdcaba";
//        char* string = "babaddtattarrattatddetartrateedredividerb";
//        char* string = "zeusnilemacaronimaisanitratetartinasiaminoracamelinsuez";
        char* s = longestPalindrome(string);
        printf("s:%s",s);
        printf("\n");
    }
    return 0;
}

char* longestPalindrome(char* s) {
    int start = 0,end=0;
    long length = strlen(s);
    if (s==NULL||length==0) {
        return "";
    }
    for (int i=0; i<length; i++) {
        int len1 = expandCenter(s,i,i);
        int len2 = expandCenter(s,i,i+1);
        int len = len1>len2?len1:len2;
        if (len>end-start) {
            start = i-(len-1)/2;
            end = start+len;
        }
    }
    char* result = (char*)malloc(sizeof(char)*(end-start+1));
    int k=0;
    for (int i=start; i<end; i++) {
        result[k] = s[i];
        k++;
    }
    result[k] = '\0';
    return result;
}

//反回字符串长度
int expandCenter(char*s, int left, int right){
    int l = left;
    int r = right;
    long length = strlen(s);
    while (l>=0&&r<length&&s[l]==s[r]) {
        l--;
        r++;
    }
    return r-l-1;
}

相关文章

网友评论

      本文标题:5. 最长回文子串

      本文链接:https://www.haomeiwen.com/subject/shbtmqtx.html