2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
福大大 答案2021-08-16:
k是字符串长度。
1.依次遍历,嵌套循环。
时间复杂度:O((N^2)k)
2.b逆序+a+b,a+b+a逆序。注意去重。
时间复杂度:O(N(k^2))。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
words := []string{"bat", "tab", "cat"}
ret := palindromePairs(words)
fmt.Println(ret)
}
func palindromePairs(words []string) [][]int {
wordset := make(map[string]int)
for i := 0; i < len(words); i++ {
wordset[words[i]] = i
}
res := make([][]int, 0)
//{ [6,23] 、 [7,13] }
for i := 0; i < len(words); i++ {
// i words[i]
// findAll(字符串,在i位置,wordset) 返回所有生成的结果返回
findRet := findAll(words[i], i, wordset)
res = append(res, findRet...)
}
return res
}
func findAll(word string, index int, words map[string]int) [][]int {
res := make([][]int, 0)
reverse := reverse(word)
rest, ok := words[""]
if ok && rest != index && word == reverse {
addRecord(&res, rest, index)
addRecord(&res, index, rest)
}
rs := manacherss(word)
mid := len(rs) >> 1
for i := 1; i < mid; i++ {
if i-rs[i] == -1 {
ok2 := false
rest, ok2 = words[reverse[0:mid-i]]
if ok2 && rest != index {
addRecord(&res, rest, index)
}
}
}
for i := mid + 1; i < len(rs); i++ {
if i+rs[i] == len(rs) {
ok3 := false
aaa := reverse[(mid<<1)-i:]
rest, ok3 = words[aaa]
if ok3 && rest != index {
addRecord(&res, index, rest)
}
}
}
return res
}
func addRecord(res *[][]int, left int, right int) {
newr := make([]int, 0)
newr = append(newr, left)
newr = append(newr, right)
*res = append(*res, newr)
}
func manacherss(word string) []int {
mchs := manachercs(word)
rs := make([]int, len(mchs))
center := -1
pr := -1
for i := 0; i != len(mchs); i++ {
if pr > i {
rs[i] = getMin(rs[center<<1-i], pr-i)
} else {
rs[i] = 1
}
for i+rs[i] < len(mchs) && i-rs[i] > -1 {
if mchs[i+rs[i]] != mchs[i-rs[i]] {
break
}
rs[i]++
}
if i+rs[i] > pr {
pr = i + rs[i]
center = i
}
}
return rs
}
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
}
func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
}
func manachercs(word string) string {
chs := []byte(word)
mchs := make([]byte, len(chs)*2+1)
index := 0
for i := 0; i != len(mchs); i++ {
if (i & 1) == 0 {
mchs[i] = '#'
} else {
mchs[i] = chs[index]
index++
}
}
return string(mchs)
}
func reverse(str string) string {
chs := []byte(str)
l := 0
r := len(chs) - 1
for l < r {
tmp := chs[l]
chs[l] = chs[r]
l++
chs[r] = tmp
r--
}
return string(chs)
}
执行结果如下:

2021-08-16:回文对。给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。的更多相关文章
- 2021.08.16 P1078 文化之旅(最短路)
2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- 2021.08.16 P1300 城市街道交通费系统(dfs)
2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...
- 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)
2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...
- 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...
- Leetcode30--->Substring with Concatenation of All Words(主串中找出连接给定所有单词的子串的位置)
题目:给定一个字符串S(主串),一个字符串数组words,其中的字符串的长度相同.找到所有的子串位置,要求是words中字符串的一个连接: 举例: For example, given:s: &quo ...
- [leetcode]131. Palindrome Partitioning字符串分割成回文子串
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- Extend to Palindrome UVA - 11475(补成回文串)
题意: 就是用最少的字符把原字符串补成回文串 解析: emm/.../网上都是用kmp和后缀数组做的 我没想到这俩的思路...emmm... 想到了exkmp的 就是原串和逆串匹配一下 注意要保证 ...
- 完美的代价(swap成回文串、贪心)
Description 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的. 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串 ...
- 使用Spire PDF for .NET将HTML转换成PDF文档
目录 开发环境说明 Spire PDF for .NET (free edition)体验 资源下载 开发环境说明 Microsoft Visual Studio 2013 Ultimate Edit ...
随机推荐
- 提供离线chrome谷歌浏览器插件crx的网站有
crx4:http://www.crx4.com/ 极简插件:https://chrome.zzzmh.cn/index 扩展迷:https://www.extfans.com/ 浏览器插件下载中心: ...
- 如何使用webgl(three.js)实现3D消防、3D建筑消防大楼、消防数字孪生、消防可视化解决方案——第十八课(一)
序: 又是很久没出随笔文章了,一篇文章有时候整理一天,实在是抽不出来时间. 最近在回顾几年前的项目时,发现这个智慧三维消防可视化项目很有回顾价值,索性就拿出来讲讲. 首先,我们要知道消防里的知识,不是 ...
- 解决Selenium元素拖拽不生效Bug
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/e8aa6c6f.html 你好,我是测试蔡坨坨. 前几天在使用Selenium进行元素拖拽操作时,发现Selenium自带的 ...
- LGV算法 CodeForces 348D + 牛客多校 A Monotonic Matrix
定理(Lindström–Gessel–Viennot lemma)很简单: 学的时候忘了大的行列式怎么算的了.. 然后就可以写题了: 第一道:CodeForces-348D(链接https://vj ...
- hdu 4870 Rating(概率dp)
题意:给你两个初始分数为0的账号让你去打比赛,每场比赛赢的概率为p,赢了加50分,输了-100分,当然你不会负分,每次你会用分低的账号去打比赛,问你把一个账号打到1000分的需要参加比赛次数的期望值. ...
- 使用python自动监控程序运行过程数据
操作系统 :CentOS 7.6.1810_x64 Python 版本 : 2.7.5 一.背景描述 工作中会遇到需要监控程序运行过程数据的情况,比如定时执行监控的cmd并记录执行结果,本文提供一种实 ...
- springboot--多环境启动
法一: 法二:
- C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF
好久没有动笔写博客了,这个小天地被我闲置的放了好久好久,接下来要慢慢捡起来了. 备注:通过C#的StreamWriter类输出一个TXT流文件,供下位机工程师使用,发现打开的16进制文件中,默认添加了 ...
- SpringBoot 项目使用 Sa-Token 完成登录认证
一.设计思路 对于一些登录之后才能访问的接口(例如:查询我的账号资料),我们通常的做法是增加一层接口校验: 如果校验通过,则:正常返回数据. 如果校验未通过,则:抛出异常,告知其需要先进行登录. 那么 ...
- vue-i18n警告
vue3引入vue-i18n警告: bundler build of vue-i18n. It is recommended to configure your bundler to explicit ...