@@ -462,7 +462,92 @@ var longestPalindrome = function(s) {
462
462
};
463
463
```
464
464
465
+ ## C
466
+ 动态规划:
467
+ ``` c
468
+ // 初始化dp数组,全部初始为false
469
+ bool **initDP (int strLen) {
470
+ bool ** dp = (bool ** )malloc(sizeof(bool * ) * strLen);
471
+ int i, j;
472
+ for(i = 0; i < strLen; ++i) {
473
+ dp[ i] = (bool * )malloc(sizeof(bool) * strLen);
474
+ for(j = 0; j < strLen; ++j)
475
+ dp[ i] [ j ] = false;
476
+ }
477
+ return dp;
478
+ }
465
479
480
+ char * longestPalindrome(char * s){
481
+ //求出字符串长度
482
+ int strLen = strlen(s);
483
+ //初始化dp数组,元素初始化为false
484
+ bool ** dp = initDP(strLen);
485
+ int maxLength = 0, left = 0, right = 0;
486
+
487
+ //从下到上,从左到右遍历
488
+ int i, j;
489
+ for(i = strLen - 1; i >= 0; --i) {
490
+ for(j = i; j < strLen; ++j) {
491
+ //若当前i与j所指字符一样
492
+ if(s[i] == s[j]) {
493
+ //若i、j指向相邻字符或同一字符,则为回文字符串
494
+ if(j - i <= 1)
495
+ dp[i][j] = true;
496
+ //若i+1与j-1所指字符串为回文字符串,则i、j所指字符串为回文字符串
497
+ else if(dp[i + 1][j - 1])
498
+ dp[i][j] = true;
499
+ }
500
+ //若新的字符串的长度大于之前的最大长度,进行更新
501
+ if(dp[i][j] && j - i + 1 > maxLength) {
502
+ maxLength = j - i + 1;
503
+ left = i;
504
+ right = j;
505
+ }
506
+ }
507
+ }
508
+ //复制回文字符串,并返回
509
+ char *ret = (char*)malloc(sizeof(char) * (maxLength + 1));
510
+ memcpy(ret, s + left, maxLength);
511
+ ret[maxLength] = 0;
512
+ return ret;
513
+ }
514
+ ```
515
+
516
+ 双指针:
517
+ ```c
518
+ int left, maxLength;
519
+ void extend(char *str, int i, int j, int size) {
520
+ while(i >= 0 && j < size && str[i] == str[j]) {
521
+ //若当前子字符串长度大于最长的字符串长度,进行更新
522
+ if(j - i + 1 > maxLength) {
523
+ maxLength = j - i + 1;
524
+ left = i;
525
+ }
526
+ //左指针左移,右指针右移。扩大搜索范围
527
+ ++j, --i;
528
+ }
529
+ }
530
+
531
+ char * longestPalindrome(char * s){
532
+ left = right = maxLength = 0;
533
+ int size = strlen(s);
534
+
535
+ int i;
536
+ for(i = 0; i < size; ++i) {
537
+ //长度为单数的子字符串
538
+ extend(s, i, i, size);
539
+ //长度为双数的子字符串
540
+ extend(s, i, i + 1, size);
541
+ }
542
+
543
+ //复制子字符串
544
+ char *subStr = (char *)malloc(sizeof(char) * (maxLength + 1));
545
+ memcpy(subStr, s + left, maxLength);
546
+ subStr[maxLength] = 0;
547
+
548
+ return subStr;
549
+ }
550
+ ```
466
551
467
552
-----------------------
468
553
<div align =" center " ><img src =https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width =500 > </img ></div >
0 commit comments