编程题-连接两字母单词得到的最长回文串(中等)

news/2025/2/24 15:00:47

题目:

给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。

请你从 words 中选择一些元素并按 任意顺序 连接它们,并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。

请你返回你能得到的最长回文串的 长度 。如果没办法得到任何一个回文串,请你返回 0 。

回文串 指的是从前往后和从后往前读一样的字符串。

解法一(贪心 + 哈希表):

根据回文串的定义,回文串可以由奇数或者偶数个words中的单词拼接而成,但必须满足以下条件:

1、如果数量为奇数,那么位于正中间的单词必须是回文字符串(即两个字符相等);

2、每个单词和反转后对应位置的单词必须互为反转字符串。

根据上面的两个条件,我们可以得出构造最长回文串的规则:

1、对于两个字符不同的单词,需要尽可能多的成对选择它和它的反转字符串;

2、对于两个字符相同的单词,需要尽可能多的成对选择该单词;

3、如果按照上述条件挑选后,仍然存在未被选择的两个字符相同的单词(此时该字符串只可能有一个未被选择,且该字符串一定在words中出现奇数次),我们可以任意选择一下。如下为笔者代码:

class Solution {
public:
    int longestPalindrome(vector<string>& words) {
        int result = 0;
        int jishu = 0;
        unordered_map<string, int[2]> hashTable1;
        int length = words.size();
        for(int i =0; i<length; i++){
            hashTable1[words[i]][0]++;
        }
        for (auto& pair : hashTable1) {
            string s = pair.first;
            if(s[0]==s[1]){
                if(pair.second[0]%2==0){
                    result = result + (pair.second[0])*2;
                }
                else{
                    if(jishu==0){
                        jishu = pair.second[0];
                        result = result + (pair.second[0])*2; 
                        continue;
                    }
                    if(jishu < pair.second[0]){
                        result = result-2+(pair.second[0])*2; 
                        jishu = (pair.second[0])*2; 
                    }
                    else{
                        result = result + (pair.second[0]-1)*2;
                    }
                }
            }
            else{
                if(pair.second[1]==0){
                    string sT = "";
                    sT = sT + s[1];
                    sT = sT + s[0];
                    auto it = hashTable1.find(sT);
                    if(it!=hashTable1.end()){
                        it->second[1]=1;
                        pair.second[1]=1;
                        int max = std::min(pair.second[0], it->second[0]);
                        result = result + max*4;
                    }
                }
            }
        }
        return result;
    }
};

笔者小记:

在遍历哈希表中的每个单词时,为了避免重复计算成对选择的单词,我们可以设置访问标记符,哈希表初始访问符设置为0,在后续遍历中将已访问的哈希表元素的标记符修改为1,添加if条件语句仅遍历标记符为0的哈希表元素,可减少时间复杂度,避免重复访问成对选择的哈希表元素。


http://www.niftyadmin.cn/n/5864495.html

相关文章

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk 35 三个报错信息如下 第一个 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…

Spark提交任务

1、Spark提交任务到Yarn 1.1、DwKuduApp spark-submit --class com.io.etl.dwkudu.DwKuduApp \ --files /etl/etl-dwkudu/conf/doris.property,/etl/etl-dwkudu/conf/redis.property,/etl/etl-dwkudu/conf/log4j.property \ --master yarn --deploy-mode cluster \ --driver-…

鸿蒙5.0实战案例:基于AVCodecKit的音视频解码及二次处理播放

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…

springcloud gateway并发量多大

Spring Cloud Gateway的并发量并非固定值&#xff0c;它受到多种因素的影响&#xff0c;包括但不限于网关配置、硬件资源&#xff08;如CPU、内存、网络带宽等&#xff09;、后端服务的处理能力以及系统整体的架构设计。因此&#xff0c;要准确回答Spring Cloud Gateway的并发量…

【Linux基础】Shell脚本

文章目录 一、前言二、Linux脚本编写基础2.1 文件开头2.2 注释2.3 变量2.3.1 系统变量2.3.2 环境变量2.3.3 用户环境变量 2.4 注意事项 三、shell脚本中常用的三类命令3.1 Linux命令3.2 管道、重定向和命令置换3.2.1 管道3.2.2 重定向3.2.3 命令置换 四、流程控制4.1 说明性语句…

软件需求类的论文无法量化评价的问题

软件需求研究的量化难题确实是一个普遍存在的挑战&#xff0c;主要原因在于需求工程本身具有强主观性、领域依赖性和过程复杂性。针对这一问题&#xff0c;可以从以下角度进行突破性思考并提出解决方案&#xff1a; 1. 构建多维度评估体系&#xff08;Multi-dimensional Evalu…

《Linux命令行和shell脚本编程大全》第一章阅读笔记

一.认识Linux Linux系统可以划分为四个部分 Linux内核GNU工具图形化桌面环境应用软件 1.Linux内核 主要功能有 系统内存管理软件程序管理硬件设备管理文件系统管理 &#xff08;1&#xff09;系统内存管理 内核管理可用物理内存&#xff0c;还可以创建并管理虚拟内存。内…

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…