2024华为OD试题及答案-A017-回文字符串

题目描述

如果一个字符串正读和反渎都一样(大小写敏感),则称它为一个「回文串」,例如:

  • leVel是一个「回文串」,因为它的正读和反读都是leVel;同理a也是「回文串」
  • art不是一个「回文串」,因为它的反读tra与正读不同
  • Level不是一个「回文串」,因为它的反读leveL与正读不同(因大小写敏感)

给你一个仅包含大小写字母的字符串,请用这些字母构造出一个最长的回文串,若有多个最长的,返回其中字典序最小的回文串。

字符串中的每个位置的字母最多备用一次,也可以不用。

输入描述

输出描述

用例
输入abczcccddzz
输出ccdzazdcc
说明
输入ABabBabA
输出ABabbaBA
说明

题目解析

回文串定义

如果一个字符串正读和反读都一样(大小写敏感),则称它为一个「回文串」。

例子分析

  1. level 是一个回文串,因为正读和反读都是 level
  2. art 不是一个回文串,因为正读和反读不一样。
  3. Level 不是一个回文串,因为正读和反读不一样(大小写敏感)。

任务描述

给定一个仅包含大小写字母的字符串,找出这些字母构造出的一个最长的回文串。若有多个最长的,返回其中字典序最小的回文串。字符中的每个字母最多使用一次,也可以不使用。

解题思路

  1. 构建所有可能的回文串:从字符串中选取所有可能的子串,判断其是否为回文串。
  2. 记录最长的回文串:在找到的所有回文串中,记录长度最长的,如果有多个,则选字典序最小的。
  3. 输出结果:输出找到的最长且字典序最小的回文串。

示例

输入:

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;
}

代码说明

  1. isPalindrome函数:判断一个字符串是否是回文串。通过左右指针向中间收缩的方法,比较每个字符是否相等。
  2. 主函数:读取输入字符串,遍历所有可能的子串,并调用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值