LeetCode 5. Longest Palindromic Substring

本文介绍了一种寻找字符串中最长回文子串的有效算法。通过中心扩展法,该算法能够快速定位并返回最长的回文子串。文章提供了C++及Python实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode.com/problems/longest-palindromic-substring/description/

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer. 

Example:

Input: "cbbd"

Output: "bb"

  • 最长回文子串。字符串处理题。可以深搜,动规,不过还是这个算法比较简单明了,找到回文串然后向两边扩张。
 1 //
 2 //  main.cpp
 3 //  LeetCode
 4 //
 5 //  Created by Hao on 2017/3/16.
 6 //  Copyright © 2017年 Hao. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <string>
11 using namespace std;
12 
13 class Solution {
14 public:
15     string longestPalindrome(string s) {
16         if (s.empty()) return "";
17         if (s.size() == 1)  return s;
18         
19         size_t start = 0, maxLen = 1;
20         
21         for (size_t i = 0; i < s.size(); ) {
22             if (s.size() - i <= maxLen / 2) break;
23             size_t j = i, k = i;
24             
25             // Duplicate characters
26             while ((k < s.size() - 1) && (s[k] == s[k + 1])) k ++;
27             
28             // Move start pointer
29             i = k + 1;
30             
31             // Expand
32             while ((k < s.size() - 1) && (j > 0) && (s[k + 1] == s[j - 1])) {
33                 k ++;
34                 j --;
35             }
36             
37             if (k - j + 1 > maxLen) {
38                 maxLen = k - j + 1;
39                 start = j;
40             }
41         }
42         
43         return s.substr(start, maxLen);
44     }
45 };
46 
47 int main ()
48 {
49     Solution testSolution;
50     string sTest[] = {"babad", "cbbd"};
51 
52     for (int i = 0; i < 2; i ++)
53         cout << testSolution.longestPalindrome(sTest[i]) << endl;
54     
55     return 0;
56 }
View Code

  • Python算法同上,注意slicing左闭右开。
 1 class Solution:
 2     def longestPalindrome(self, s: str) -> str:
 3         if not s:
 4             return ""
 5         
 6         if len( s ) == 1:
 7             return s
 8         
 9         n_s = len( s )
10         start, maxlen = 0, 1
11         i = 0
12         
13         while i < n_s:
14             if n_s - i <= maxlen / 2:
15                 break;
16                 
17             left = right = i
18             
19             # move right point as duplicate chars is the center of palindromic substring
20             while ( right + 1 < n_s ) and ( s[ right ] == s[ right + 1 ] ):
21                 right += 1
22             
23             # start point of next loop
24             i = right + 1
25                         
26             # expand left and right points
27             while ( left > 0 ) and ( right + 1 < n_s ) and ( s[ left - 1 ] == s[ right + 1 ] ):
28                 left -= 1
29                 right += 1
30                 
31             if right - left + 1 > maxlen:
32                 maxlen = right - left + 1
33                 start = left
34 
35         # pay attention to slicing
36         return s[ start : start + maxlen ]        
View Code

 

 

转载于:https://www.cnblogs.com/pegasus923/p/7459862.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值