2021-04-03:给定两个字符串str1和str2,想把str2整体插入到str1中的某个位置,形成最大的字典序,返回字典序最大的结果。

福大大 答案2021-04-03:

1.暴力法。

2.DC3算法。自然智慧想不到,需要练敏感度。

2.1.构造字符串。str = str1+最小字符+str2。

2.2.对str进行dc3算法,求出rank数组。

2.3.遍历0到str1长度,找到小于str2起始位置的序号。

2.4.根据序号算出bestSplit值。时间紧,先放一放。

2.5.根据bestSplit拆分str1,然后合并。返回str1左+str2+str1右。

代码用golang编写。代码如下:

package main

import (
"fmt"
"index/suffixarray"
"math/rand"
"time"
"unsafe"
) func main() {
rand.Seed(time.Now().Unix()) //YJWBRFKBMYQWFCRTSA
//YTOFNTX cnt := 0
const TOTAL = 10000
for i := 0; i < TOTAL; i++ {
s1 := newRandString()
s2 := newRandString()
fmt.Println("s1 = ", s1)
fmt.Println("s2 = ", s2)
ret1 := right(s1, s2)
ret2 := maxCombine(s1, s2)
fmt.Println("暴力的答案:", ret1)
fmt.Println("DC3的答案:", ret2)
if ret1 == ret2 {
fmt.Println("正确")
cnt++
} else { fmt.Println("错误")
}
fmt.Println("-------------")
}
fmt.Println("总数:", TOTAL)
fmt.Println("正确:", cnt)
}
func newRandString() string {
retLen := rand.Intn(20) + 5
ret := make([]byte, retLen)
for i := 0; i < retLen; i++ {
ret[i] = byte(rand.Intn(26) + 'A')
}
return string(ret)
}
func right(s1 string, s2 string) string {
if len(s1) == 0 {
return s2
}
if len(s2) == 0 {
return s1
}
ans := s1 + s2 temp := ""
best := len(s1)
for i := 0; i < len(s1); i++ {
temp = s1[0:i] + s2 + s1[i:]
if temp > ans {
ans = temp
best = i
}
}
fmt.Println("暴力best = ", best)
return ans
} // 正式方法 O(N+M) + O(M^2)
// N : s1长度
// M : s2长度
func maxCombine(s1 string, s2 string) string {
if len(s1) == 0 {
return s2
}
if len(s2) == 0 {
return s1
}
str1 := []byte(s1)
str2 := []byte(s2)
N := len(str1) M := len(str2)
min := str1[0]
max := str1[0]
for i := 1; i < N; i++ {
min = getMin(min, str1[i])
max = getMax(max, str1[i])
}
for i := 0; i < M; i++ {
min = getMin(min, str2[i])
max = getMax(max, str2[i])
}
all := make([]byte, N+M+1)
index := 0
for i := 0; i < N; i++ {
all[index] = str1[i] - min + 2
index++
}
all[index] = 1
index++
for i := 0; i < M; i++ {
all[index] = str2[i] - min + 2
index++
}
dc3 := NewFddSa(all)
comp := N + 1
for i := 0; i < N; i++ {
if dc3.Rank[i] < dc3.Rank[comp] {
best := bestSplit(s1, s2, i)
//best := i //这句代码是错的
fmt.Println("DC3的best = ", best)
return s1[0:best] + s2 + s1[best:]
}
}
return s1 + s2
} func bestSplit(s1 string, s2 string, first int) int {
N := len(s1)
M := len(s2)
end := N
for i, j := first, 0; i < N && j < M; i, j = i+1, j+1 {
if s1[i] < s2[j] {
end = i
break
}
}
bestPrefix := s2
bestSplit := first
for i, j := first+1, M-1; i <= end; i, j = i+1, j-1 {
curPrefix := s1[first:i] + s2[0:j]
if curPrefix >= bestPrefix {
bestPrefix = curPrefix
bestSplit = i
}
}
if bestSplit != first {
fmt.Println("注意,first = ", first, " ,bestSplit = ", bestSplit)
}
return bestSplit
}
func getMax(a byte, b byte) byte {
if a > b {
return a
} else {
return b
}
}
func getMin(a byte, b byte) byte {
if a < b {
return a
} else {
return b
}
} type FddSa struct {
Sa []int
Rank []int
} func NewFddSa(bytes []byte) *FddSa {
ret := &FddSa{}
ret.Rank = make([]int, len(bytes))
ret.Sa = make([]int, len(bytes))
index := suffixarray.New(bytes)
p1 := uintptr(unsafe.Pointer(index)) //获取指针
p1 += 24
p2 := *(*[]int32)(unsafe.Pointer(p1)) //将指针转行成切片
for i := 0; i < len(bytes); i++ {
ret.Sa[i] = int(p2[i]) //sa数组
ret.Rank[int(p2[i])] = i //rank数组
}
return ret
}

执行结果如下:


左神java代码

评论

2021-04-03:给定两个字符串str1和str2,想把str2整体插入到str1中的某个位置,形成最大的字典序,返回字典序最大的结果。的更多相关文章

  1. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  2. 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。

    import java.util.Scanner;/*    给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000),    另一个是目标字符串TS(长度<1 ...

  3. 2021.04.03【NOIP提高B组】模拟 总结

    T1 题目大意:求最小的 \(n\in[0,lim]\) 使得区间 \([L,R]\) 在线段树建树 \(build(0,n)\) 的区间内 考场时想到了正解,结果推式子退错了... 其实就是从下往上 ...

  4. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

  5. ✡ leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

    Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到 ...

  6. [Swift]LeetCode712. 两个字符串的最小ASCII删除和 | Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  7. 【leet-code】712. 两个字符串的最小ASCII删除和

    题目描述 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...

  8. poj 3415 后缀数组 两个字符串中长度不小于 k 的公共子串的个数

    Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 11469   Accepted: 379 ...

  9. Q712 两个字符串的最小ASCII删除和

    给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" 输出: ...

  10. Python-求解两个字符串的最长公共子序列

    一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...

随机推荐

  1. 在VS中C#工程操作Mysql数据库

    1.实现mysql数据库与VS的连接,需要安装两个插件,作者装的是mysql-connector-net-6.9.9.msi和 mysql-for-visualstudio-1.2.6.msi. 2. ...

  2. C#开发微信

    C#开发微信门户及应用教程   C#开发微信门户及应用(1)--开始使用微信接口... 6 1.微信账号... 6 2.微信菜单定义... 7 3.接入微信的链接处理... 8 4.使用开发方式创建菜 ...

  3. (2)请用requests库的get()函数访问如下一个网站20次,打印返回状态,text()内容,计算text()属性和content属性所返回网页内容的长度。

    # 导入库 import requests from bs4 import BeautifulSoup def getUrlText(url): try: web = requests.get(url ...

  4. pyecharts 学习使用网址

    pyecharts新版官方手册地址:https://pyecharts.org/#/zh-cn/intro 或http://pyecharts.org/#/?id=pyecharts或http://p ...

  5. baodoumi yml配置

    上次因为自增,发现配置没生效, 修改后如下 # 配置mybatis-plus, 参考:com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropert ...

  6. Keepalived+HAProxy基于ACL实现单IP多域名负载功能

    编译安装 HAProxy 新版 LTS 版本,编译安装 Keepalived 开启HAProxy多线程,线程数与CPU核心数保持一致,并绑定CPU核心 因业务较多避免配置文件误操作,需要按每业务一个配 ...

  7. 跳出思维的“盒子”,聊聊 RTE 应用创新大赛的那些作品

    由声网Agora 与环信联合主办的"RTE 2021 编程挑战赛"已圆满落幕.在今年的大赛中,来自行业中不同领域的专家参与了决赛评选,包括 Linux 中国技术社区技术负责人 白宦 ...

  8. 《深入理解高并发编程:JDK核心技术》-冰河新书上市

    大家好,我是冰河~~ 废话说多了没用,并发编程技术一直是初级程序员进阶高级工程师的前提条件,也是成为大厂程序员的必备技能,更是突破自身技术瓶颈的必经之路. 2022年6月我出版了"冰河技术丛 ...

  9. 谷歌浏览器配置Selenium,并配合python使用

    python环境准备 python 需要安装selenium ,这个直接pip安装即可 pip install selenium -i http://pypi.douban.com/simple -- ...

  10. vue双向监听proxy

    console.log('判断页面是否有滚动条', this.hasScrollbar) const that = this that.count = 0 // 计数 that.scrollProxy ...