题目描述
如果一个字符串正读和反渎都一样(大小写敏感),则称它为一个「回文串」,例如:
- leVel是一个「回文串」,因为它的正读和反读都是leVel;同理a也是「回文串」
- art不是一个「回文串」,因为它的反读tra与正读不同
- Level不是一个「回文串」,因为它的反读leveL与正读不同(因大小写敏感)
给你一个仅包含大小写字母的字符串,请用这些字母构造出一个最长的回文串,若有多个最长的,返回其中字典序最小的回文串。
字符串中的每个位置的字母最多备用一次,也可以不用。
输入描述
无
输出描述
无
用例
输入 | abczcccddzz |
输出 | ccdzazdcc |
说明 | 无 |
输入 | ABabBabA |
输出 | ABabbaBA |
说明 | 无 |
题目解析
回文串定义
如果一个字符串正读和反读都一样(大小写敏感),则称它为一个「回文串」。
例子分析
level
是一个回文串,因为正读和反读都是level
。art
不是一个回文串,因为正读和反读不一样。Level
不是一个回文串,因为正读和反读不一样(大小写敏感)。
任务描述
给定一个仅包含大小写字母的字符串,找出这些字母构造出的一个最长的回文串。若有多个最长的,返回其中字典序最小的回文串。字符中的每个字母最多使用一次,也可以不使用。
解题思路
- 构建所有可能的回文串:从字符串中选取所有可能的子串,判断其是否为回文串。
- 记录最长的回文串:在找到的所有回文串中,记录长度最长的,如果有多个,则选字典序最小的。
- 输出结果:输出找到的最长且字典序最小的回文串。
示例
输入:
abczcccdzz
输出:
ccdzazdcc
代码实现
下面是解决此问题的C++代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 判断一个字符串是否为回文串
bool isPalindrome(const string &str) {
int left = 0, right = str.size() - 1;
while (left < right) {
if (str[left] != str[right]) {
return false;
}
++left;
--right;
}
return true;
}
// 主函数
int main() {
string input;
cin >> input;
int maxLength = 0;
string longestPalindrome = "";
// 枚举所有子串
for (int i = 0; i < input.size(); ++i) {
for (int j = i; j < input.size(); ++j) {
string subStr = input.substr(i, j - i + 1);
if (isPalindrome(subStr)) {
// 更新最长回文串
if (subStr.size() > maxLength ||
(subStr.size() == maxLength && subStr < longestPalindrome)) {
maxLength = subStr.size();
longestPalindrome = subStr;
}
}
}
}
cout << longestPalindrome << endl;
return 0;
}
代码说明
- isPalindrome函数:判断一个字符串是否是回文串。通过左右指针向中间收缩的方法,比较每个字符是否相等。
- 主函数:读取输入字符串,遍历所有可能的子串,并调用
isPalindrome
函数判断是否为回文串。如果是,则检查其长度是否为当前找到的最长回文串,如果是则更新最长回文串。最后输出最长的回文串。
这个程序将输入的字符串中找到的最长的回文子串输出,并在多个相同长度的回文串中选择字典序最小的那个。
Python实现
以下是解决此问题的python代码:
def is_palindrome(s):
return s == s[::-1]
def find_longest_palindrome(s):
max_length = 0
longest_palindrome = ""
# 枚举所有子串
for i in range(len(s)):
for j in range(i, len(s)):
sub_str = s[i:j+1]
if is_palindrome(sub_str):
# 更新最长回文串
if len(sub_str) > max_length or (len(sub_str) == max_length and sub_str < longest_palindrome):
max_length = len(sub_str)
longest_palindrome = sub_str
return longest_palindrome
# 读取输入
input_str = input().strip()
# 找到最长回文串
result = find_longest_palindrome(input_str)
# 输出结果
print(result)