LeetCode 336. 回文对(哈希map/Trie树)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 哈希map
      • 2.2 Trie树

1. 题目

给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。

示例 1:
输入: ["abcd","dcba","lls","s","sssll"]
输出: [[0,1],[1,0],[3,2],[2,4]] 
解释: 可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]示例 2:
输入: ["bat","tab","cat"]
输出: [[0,1],[1,0]] 
解释: 可拼接成的回文串为 ["battab","tabbat"]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

在这里插入图片描述

2.1 哈希map

class Solution {
public:vector<vector<int>> palindromePairs(vector<string>& words) {unordered_map<string, int> w_id;set<int> wdLen;for(int i = 0; i < words.size(); ++i){w_id[words[i]] = i;//字符串idxwdLen.insert(words[i].size());//字符串长度}vector<vector<int>> ans;string front, back, revword;for(int i = 0; i < words.size(); ++i){revword = words[i];//逆序的字符串reverse(revword.begin(),revword.end());if(w_id.count(revword) && w_id[revword] != i)ans.push_back({i, w_id[revword]});//字符串的逆序存在//遍历words[i]可能的子串长度,寻找前部分存在或者后部分存在//且自身剩余的子串为回文int len = words[i].size();for(auto it = wdLen.begin(); *it < len; ++it){front = words[i].substr(0, *it);reverse(front.begin(),front.end());back = words[i].substr(*it);if(w_id.count(front) && ispalind(back))//前缀的逆存在ans.push_back({i, w_id[front]});}for(auto it = wdLen.begin(); *it < len; ++it){front = revword.substr(0, *it);back = revword.substr(*it);if(w_id.count(front) && ispalind(back))//后缀的逆存在ans.push_back({w_id[front], i});}}return ans;}bool ispalind(string& s){int l = 0, r = s.size()-1;while(l < r)if(s[l++] != s[r--])return false;return true;}
};

904 ms 45.6 MB

2.2 Trie树

class trie
{
public:unordered_map<char, trie*> next;int suffix = -1;void insert(string& s, int idx){trie *cur = this;for(int i = s.size()-1; i >= 0; --i)//单词逆序插入{if(!cur->next[s[i]])cur->next[s[i]] = new trie();cur = cur->next[s[i]];}cur->suffix = idx;//结束时记录单词编号}
};
class Solution {
public:vector<vector<int>> palindromePairs(vector<string>& words) {trie * t = new trie(), *cur;vector<vector<int>> ans;string revword;for(int i = 0; i < words.size(); ++i){t->insert(words[i], i);}for(int i = 0; i < words.size(); ++i){int n = words[i].size(), j, k;cur = t;for(j = 0; j < n; ++j){if(cur->suffix != -1 && cur->suffix != i&& ispalind(words[i], j, n-1))//单词的前缀的逆序在trie中,剩余的为回文ans.push_back({i, cur->suffix});if(!cur->next[words[i][j]])break;cur = cur->next[words[i][j]];}for(j = 0; j <= n; ++j)//等号上下只取一次,否则答案有重复的{	// j == n 时包含了完整字符串的情况cur = t;for(k = n-j; k < n; ++k)//遍历单词的后缀{if(!cur->next[words[i][k]])break;cur = cur->next[words[i][k]];}if(k==n && cur->suffix != -1&& cur->suffix != i && ispalind(words[i], 0, n-j-1))//该后缀的逆在trie中,且前部分为回文ans.push_back({cur->suffix, i});}}return ans;}bool ispalind(string s, int l, int r){while(l < r)if(s[l++] != s[r--])return false;return true;}
};

940 ms 141.3 MB

trie 改用数组 trie* next[26] = {NULL}; 提高运行效率

280 ms 208.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链接

Qt下载&#xff1a;http://qt-project.org/downloads/ Qt Creator中无法使用OpenCV2中新函数的解决办法: http://blog.csdn.net/masikkk/article/details/8748865 自建CDN技术选型: squid varnish nginx: http://www.linuxde.net/2013/05/13492.html转载于:https://www.cnblogs…

python中的常见的列表操作及注意事项

1.1 使用append()添加元素到尾部传统的向列表中添加元素的方法是利用append()函数将元素一个个添加到尾部。1.2 使用extend()或合并列表使用extend()可以将一个列表合并到另一个列表中&#xff0c;我们也可以使用.1.3 使用insert()在指定位置插入元素append()函数只能将新元素插…

Android8.0一键root,小米Mix 2(安卓8.0)一键ROOT详解教程,看教程ROOT

伴随着安卓刷机越来越流行&#xff0c;很多安卓用户都喜欢上了这种可以自定个性系统的行为&#xff0c;那么小米Mix 2(安卓8.0)怎么获取ROOT权限?小米Mix 2(安卓8.0)一键ROOT过程如何操作呢?奇兔小编在此大家说一说1.首先打开奇兔刷机软件&#xff0c;插好数据线&#xff0c;…

python中的列表及注意事项

目录 1、列表概念 2、列表创建 3、使用[]获取元素 4、列表嵌套&#xff1a; 1、列表概念 列表非常适合利用顺序和位置定义某一个元素&#xff0c;尤其是当元素的顺序或内容经常发生改变的时候。与字符串不同&#xff0c;列表中元素的值是可以修改的。我们可以直接对列表中进行添…

一周小记(六)

想要写的东西很多&#xff0c;目前只有这个坚持下来了 才第6周&#xff0c;前方的路还很长&#xff0c;能坚持3个月么&#xff0c;能坚持半年么&#xff0c;能坚持一年么&#xff0c;拭目以待 本周是五一假期周&#xff0c;只上了一天班 最近的工作中体现了一个问题&#xff0c…

刷机后如何升级android,手机系统怎么升级 三大方法大全【图文】

最近小编收到网友的问题&#xff0c;提到安卓手机系统怎么升级。对于这个问题&#xff0c;小编可是绞尽脑汁在网络上查找了好多资料&#xff0c;通过查阅资料&#xff0c;小编发现安卓系统升级多数是手机自动升级、或者通过手机自带的软件商店下载升级包。小编觉得这两种种方法…

python中的字典及注意事项

1、用大括号{}将一系列以逗号隔开的键值对(key:value)包裹起来即可以进行字典的创建。最简单的字典是空字典&#xff0c;不包括任何的键值对。 info {name:班长, id:100, sex:f, address:地球亚洲中国北京}print(info[name])print(info[address]) 注意&#xff1a;列表我们使用…

poj 1269 直线相交情况

链接&#xff1a;http://poj.org/problem?id1269 题意&#xff1a;给两条直线&#xff0c;判断它们是重合、平行还是相交&#xff0c;相交则求交点。 #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std;…

LeetCode 1059. 从始点到终点的所有路径(回溯)

文章目录1. 题目2. 解题1. 题目 给定有向图的边 edges&#xff0c;以及该图的始点 source 和目标终点 destination&#xff0c;确定从始点 source 出发的所有路径是否最终结束于目标终点 destination&#xff0c;即&#xff1a; 从始点 source 到目标终点 destination 存在至…

Android显存到内存拷贝耗时,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升...

封面出自&#xff1a;板栗懒得很memcpy是C/C的一个标准函数&#xff0c;原型void *memcpy(void *dest, const void *src, size_t n)&#xff0c;用于从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。neon是适用于ARM Cortex-A系列处理器…

python中字典的常用操作命令及注意事项

目录 1、 使用update()合并字典 2、 使用del删除具有指定键的元素 3、 使用clear清除所有元素 4、 使用in判断是否存在 5、 使用[key]获取元素 6、 使用keys()获取所有键 7、 使用values()获取所有值 8、 使用items()获取所有键值对 9、运算符 1、 使用update()合并字…

[转载]MVVM、MVVMLight、MVVMLight Toolkit之我见

本文转自 陈希章-MVVM、MVVMLight、MVVMLight Toolkit之我见 MVVM、MVVMLight、MVVMLight Toolkit之我见 我想&#xff0c;现在已经有不少朋友在项目中使用了MVVMLight了吧&#xff0c;如果你正在做WPF&#xff0c;Silverlight&#xff0c;Windows Phone的开发&#xff0c;那么…

LeetCode 1058. 最小化舍入误差以满足目标(排序+贪心)

文章目录1. 题目2. 解题1. 题目 给定一系列价格 [p1,p2…,pn] 和一个目标 target&#xff0c;将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn(pn)] 之和达到给定的目标值 target。每次舍入操作 Roundi(pi) 可以是向下舍 Floor(pi) 也可以是…

python中文件打开与关闭操作命令

1.文件打开与关闭 在python&#xff0c;使用open函数&#xff0c;可以打开一个已经存在的文件&#xff0c;或者创建一个新文件 open(文件名&#xff0c;访问模式)。 f open(test.txt, w) 文件打开模式: 访问模式 说明 r 以只读方式打开文件。文件的指针将会放在文件的开…

贪吃蛇html一维坐标,html贪吃蛇

HTML>var cdocument.getElementById("myCanvas");var time 160 ; //蛇的速度var cxtc.getContext("2d");var x y 8;var a 0; //食物坐标var t 20; //舍身长var map []; //记录蛇运行路径var size 8; //蛇身单元大小var direction 2; // 1 向上 …

LeetCode 1055. 形成字符串的最短路径(贪心)

文章目录1. 题目2. 解题1. 题目 对于任何字符串&#xff0c;我们可以通过删除其中一些字符&#xff08;也可能不删除&#xff09;来构造该字符串的子序列。 给定源字符串 source 和目标字符串 target&#xff0c;找出源字符串中能通过串联形成目标字符串的子序列的最小数量。…

html语言重点,HTML 基础重点(1)

什么是 HTML&#xff1f;HTML 全名是「超文本标记语言」(HyperText Markup Language)&#xff0c;最初是欧洲核子研究中心为了即时分享研究成果而发明了 www 万维网和 HTML。网页开发&#xff0c;涉及三种技术&#xff1a;HTML、CSS 和 JS。其中 HTML 是用于定义「网页的结构和…

python中文件读取操作及注意事项

我们想要读一些文件&#xff0c;那么可以使用read()函数、readline()函数、或者readlines()函数。 其中read()函数可以一次性读取文件中所有的内容&#xff0c;也可以设置read(100)&#xff0c;也就是一次读取100字节内容。读到文件结尾之后&#xff0c;再次调用read()会返回空…

[Kaggle] Housing Prices 房价预测

文章目录1. Baseline1. 特征选择2. 异常值剔除3. 建模预测2. 待优化特征工程房价预测 kaggle 地址 参考文章&#xff1a;kaggle比赛&#xff1a;房价预测&#xff08;排名前4%&#xff09; 1. Baseline import numpy as np import pandas as pd %matplotlib inline import m…

鼠标经过超链接文字变色

1、第一种方法 <a href"#" style" text-decoration:none;" onmouseover"javascript:this.style.colorred" onmouseout"javascript:this.style.colorblack">测试文字</a> 2、第二种方法 <style type"text/css"…