求解最大回文字符串长度 — 三种算法

来源:互联网 发布:小蚂蚁微信编辑器源码 编辑:程序博客网 时间:2024/05/16 13:50

中心扩展法

int findLongestPalindrome(string &s) {    const int length = s.size();    int maxlength = 0;    // 长度为奇数    for (int i=0; i<length; i++) {        int j=i-1, k=i+1;        while (j>=0 && k<length && s.at(j)==s.at(k)) {            if(k-j+1 > maxlength)                maxlength = k-j+1;            j--;            k++;        }    }    // 长度为偶数    for (int i=0; i<length; i++) {        int j=i, k=i+1;        while (j>=0 && k<length && s.at(j)==s.at(k)) {            if(k-j+1 > maxlength)                maxlength = k-j+1;            j--;            k++;        }    }    return maxlength;}

Manacher

int Manacher(char *st,int len){    int mx=0, ans=0, po=0;    for (int i=1; i<=len; i++) {        if (mx > i)            Len[i] = min(mx-i, Len[2*po-i]);        else            Len[i] = 1;        while (st[i-Len[i]] == st[i+Len[i]])            Len[i]++;        if (Len[i]+i > mx) {            mx = Len[i]+i;            po = i;        }        ans = max(ans, Len[i]);    }    return ans-1;}

动态规划

public int longestPalindrome(String s) {     int n=s.length();     boolean[][] pal=new boolean[n][n];     //pal[i][j] 表示s[i...j]是否是回文串     int maxLen=0;     for (int i=0;i<n;i++){  // i作为终点         int j=i;    //j作为起点         while (j>=0){             if (s.charAt(j)==s.charAt(i)&&(i-j<2||pal[j+1][i-1])){                 pal[j][i]=true;                maxLen=Math.max(maxLen, i-j+1);             }             j--;         }     }     return maxLen;}

0 0
原创粉丝点击