leetcode每日一题-最长回文字串

一开始用暴力法,时间复杂度是O( n 3 n^3 n3),结果显而易见,TLE,所以就去找了一下题解。

一、中间扩散法

遍历整个字符串。
从第一个开始,设置两个标签,分别标记回文串的左端和右端,同时要考虑两种情况:

1.回文串长度是偶数

2.回文串长度是奇数

于是写了下面的判定方法:

		if(left>0 && s[left-1] == s[left])
        {
            left--;
            len++;
        }
        if(right<k-1 && s[right+1] == s[right])
        {
            right++;
            len++;
        }

但是发现,这样写了以后,当出现输入为奇数同一字符时,如“ccccc”,会出现输出少一位的bug,即“cccc”,导致出错,于是将两个if更改为while,处理特殊情况:

		while(left>0 && s[left-1] == s[left])
       {
           left--;
           len++;
       }
       while(right<k-1 && s[right+1] == s[right])
       {
           right++;
           len++;
       }

整体代码如下:

char * longestPalindrome(char * s){
   int left, right, max=0;
   int k=0;
   while(s[k] != '\0')k++;
   int a[2] = {0};

   int i;
   for(i=0; i<k; i++)
   {
       int len = 1;
       left = i;
       right = i;

       while(left>0 && s[left-1] == s[left])
       {
           left--;
           len++;
       }
       while(right<k-1 && s[right+1] == s[right])
       {
           right++;
           len++;
       }
       while(left > 0 && right < k-1)
       {
           if(s[left-1] == s[right+1])
           {
               left--;
               right++;
               len += 2;
           }
           else break;
       }

       if(len > max)
       {
           a[0] = left;
           a[1] = right;
           max = len;
       }
   }

   static char b[1005];
   int n = 0;
   for(i=a[0]; i<=a[1]; i++)
   {
       b[n++] = s[i];
   }
   b[n] = '\0';

   return b;

}

时间复杂度为O( n 2 n^2 n2),用到一个辅助输出的数组,空间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值