leetcode-214. Shortest Palindrome

来源:互联网 发布:我只是数据txt书包网 编辑:程序博客网 时间:2024/06/05 21:40

题目链接:点击打开链接


解:

从左向右遍历,根据回文串的特点向两边展开,取最短的回文串。



代码C++:

#include <iostream>#include <string>#include <math.h>using namespace std;    string shortestPalindrome(string s) {        int len = s.length();        int minLen = 2*len-1;        int site = 0;        for(int i=0; i<=len/2; i++){            int j=i,k=i;            int flag = 1;            int l = 0;            while(j>=0 && k<len){                if(s[j] != s[k]){                    flag = 0;                    break;                }                j--;                k++;            }            if(i >= len/2){l = (i+1)*2-1; }            else { l = (len-i)*2-1;}            if(flag && l<minLen ) {                minLen = l;                site = i;            }            j=i-1;            k=i;            flag = 1;            while(j>=0 && k<len){                if(s[j] != s[k]){                    flag = 0;                    break;                }                j--;                k++;            }            if(i > len/2){l = (i)*2;}            else {l = (len-i)*2;}            if(flag && l<minLen ) {                minLen = l;                site = i;            }        }        string str = "";        if(minLen % 2 == 0){            if(site <= len/2){                int tl = len-site;                str = s.substr(site,len);                for(int i=0; i<tl/2; i++){                    int tmp = str[i];                    str[i] = str[tl-i-1];                    str[tl-i-1] = tmp;                }                str += s.substr(site,len);            }else{                int tl = site;                str = s.substr(0,site);                for(int i=0; i<tl/2; i++){                    int tmp = str[i];                    str[i] = str[tl-i-1];                    str[tl-i-1] = tmp;                }                str = s.substr(0,site)+str;            }        }else{            if(site+1 <= len/2){                int tl = len-site-1;                str = s.substr(site+1,len);                for(int i=0; i<tl/2; i++){                    int tmp = str[i];                    str[i] = str[tl-i-1];                    str[tl-i-1] = tmp;                }                str += s.substr(site,len);            }else{                int tl = site;                str = s.substr(0,site);                for(int i=0; i<tl/2; i++){                    int tmp = str[i];                    str[i] = str[tl-i-1];                    str[tl-i-1] = tmp;                }                str = s.substr(0,site+1)+str;            }        }        //cout << site << " " << minLen <<endl;        return str;    }int main(){    //cout << shortestPalindrome("abb") << endl;    return 0;}


0 0
原创粉丝点击