当前位置: 首页 > news >正文

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

题目:

给你一个字符串数组 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的哈希表元素,可减少时间复杂度,避免重复访问成对选择的哈希表元素。

相关文章:

  • 从网络基础到安全防护:网安运维小白的入门学习路线
  • python-静态方法和类方法
  • 蓝桥杯训练题目(一)—— 难度:简单(除了最后一题哈)
  • 《Python实战进阶》专栏 No 4:高效、简洁、强大之使用 FastAPI 构建高性能异步API
  • 请简述一下Prefab(预制体)的本质是什么?
  • 大白话TypeScript第三章高级特性学习
  • 使用Socket编写超牛的http服务器和客户端(一)
  • L1-6 剪切粘贴(字符串增删查改)
  • INTJ人格的本质
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter21-错误处理与调试
  • Linux 命令大全完整版(12)
  • apply的用法
  • 自动驾驶中planning为什么要把横纵向分开优化?
  • AI知识架构之RAG
  • 如何在VMware虚拟机的window10系统中安装网易mumu模拟器
  • Linux权限(一)
  • 【Java】求绝对值
  • hive开窗函数边界值ROWS BETWEEN 和 RANGE BETWEEN区别
  • 【带你 langchain 双排系列教程】6.LangChain多模态输入与自定义输出实战指南
  • 机器学习数学通关指南——链式法则
  • 释新闻|印度宣布“掐断”巴基斯坦水源,对两国意味着什么?
  • 神十九乘组视频祝福第十个中国航天日,展望中华民族登月梦圆
  • 上海市闵行区原二级巡视员琚汉铮接受纪律审查和监察调查
  • 最高法:学校未及时发现并制止校园暴力行为,需承担侵权责任
  • 男粉丝咬伤女主播嘴后写的条子引争议:赔偿“十万元”还是“十5元”?
  • 最高检发布知识产权检察白皮书,“知识产权检察厅”同日亮相