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 ...
随机推荐
- Dubbo常见问题
1. dubbo No provider available for the service com.alibaba.dubbo.monitor.MonitorService from registr ...
- 什么是Markdown
什么是markdown? Markdown是一种轻量级标记语言,它允许人们使用已读一些的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档.这种语言吸收了很多在电子邮件中已有的纯文本标 ...
- Python练习--简单练习(一看就能写出来的代码)
两数之和 数字的阶乘 求圆的面积 (输入半径,求解圆的面积) 求区间内所有素数的和 求前N个数字的平方和
- 论文解读(CosFace)《CosFace: Large Margin Cosine Loss for Deep Face Recognition》
论文信息 论文标题:CosFace: Large Margin Cosine Loss for Deep Face Recognition论文作者:H. Wang, Yitong Wang, Zhen ...
- WebSocket服务器
//创建websocket 服务器 ws_server.php //https://wiki.swoole.com/wiki/page/479.html //创建websocket服务器对象,监听0 ...
- vue使用keep-alive出现的的activated和deactivated生命周期
<keep-alive>包裹的动态组件会被缓存,它是一个抽象组件,它自身不会渲染一个dom元素,也不会出现在父组件链中.当组件在 <keep-alive> 内被切换,它的 ac ...
- Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现
本篇文章将会详细讲在flask框架如何写cbv.请求与响应.请求扩展.session源码分析.闪现等知识点. 目录 一.flask写CBV 二.请求与响应 三.session 四.闪现flash 五. ...
- [数据库/MySQL]数据类型:enum 枚举类型
1 需求描述 场景 性别(gender) :男 / 女 / 保密 2 基本语法 enum(枚举值 1,枚举值 2...); 枚举值列表在 255 个以内,使用 1 个字节来存储 枚举值列表超过 255 ...
- .NET Exceptionless 本地部署踩坑记录
仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...
- Thread面试题
面试题目录https://www.cnblogs.com/Kaelthas/p/15005844.html 1.一个Thread对象代表一个线程,同一个线程能否多次启动? 不能,在Thread类中变量 ...