【LeetCode】214. Shortest Palindrome

先贴一个C语言版的,没有通过AC。自我感觉良好,没有bug,但是在最后一个测试用例上超出运行时间。等待装好开发环境后,测试一下。

char* shortestPalindrome(char* s) {
    char c;
    int i = 1;
    char* length =NULL;char* copyStart = NULL;char* copyEnd =NULL ;char* sEnd = NULL;char* temp = NULL;
    bool notSure = true,notSureP = true,notSureL = true;
    if(strlen(s)<2 && !s ){
        return s;
    }
    //逆序判断最大回文串
    for(i=strlen(s)/2;i>0;i--){
        length = s + i-1;
        notSure = true,notSureP = true,notSureL = true;
        copyStart = length+1;//取前个长度后,再截取length个长度;
        do{
            if(notSureP && (*length) != (*copyStart)){
                notSureP = false;
            }
            if(notSureL && (*length) != *(copyStart+1)){
                notSureL = false;
            }
            notSure = notSureP||notSureL;
            length--;
            copyStart++;
        }while(length!=s && notSure);
        if(notSure){
           copyEnd = notSureL?s+i*2+1:s+i*2; 
            break;
        }
    };
    //补足待返回字符串后面的子串
    if(!copyEnd){
       copyEnd = s+1;
    }
    sEnd = s+strlen(s)-1;
    temp = sEnd+1;
    while(copyEnd!=sEnd+1){
        *(temp) = *(copyEnd);
        temp++;
        copyEnd++;
    }
    *temp = '\0';
    //反转前部分字符串
    copyStart = s;// s = aacecaaaa
    while((sEnd != copyStart) && (sEnd != copyStart+1)){
        c = *sEnd;
        *sEnd = *copyStart;
        *copyStart = c;
        copyStart ++;
        sEnd --;
    };
    c = *sEnd;
    *sEnd = *copyStart;
    *copyStart = c;
    return s;
}

贴个JS版的,通过AC.

var shortestPalindrome = function(s) {
    var hasP =1;
    var preStr = "";
    for(i=1;i<=s.length/2;i++){
        preStr = s.charAt(i-1)+preStr;
        if(preStr == s.substr(i+1,i)){
            hasP = 2*i+1;
        }else if(preStr == s.substr(i,i)){
            hasP = 2*i;
        }
    }
    return s.substr(hasP).split("").reverse().join("") + s;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值