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. nginx 代理路径

    反向代理被代理url没有截取 /report/api/ /report/api/bussinessRisk/zhucai/creditInquiry 应该是/bussinessRisk/zhucai/ ...

  2. 打开CMD方式

    打开CMD的方式 win+r 输入cmd 常用的Dos命令 1.#盘符切换2.#查看当前文件目录下的所有文件 dir3.#切换目录 cd change directory4.#cd .. 返回上级5. ...

  3. 一文快速回顾 Session 和 Cookie

    前言 在 Web 应用程序中(通俗点,可以理解成一个网站),Session 和 Cookie 是两个非常重要的概念,主要用于实现用户身份认证.数据传递等功能.今天就来讲讲这两个东西. 对于当时刚开始接 ...

  4. 关于再次报错500--Servlet报出异常

    我是根据这样的方法解决的: 本来在前几篇里面,我是将get或者post的没有用到的方法里面自带的super方法直接删除了的,然后今天运行发现,功能实现不了,还报出500的异常错误: 心态直接裂开,然后 ...

  5. windows 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

    目录 开启多个 ws 服务失败 开启服务失败解决办法 同一个窗口中运行 开启多个 ws 服务失败 正常情况下,如果你想开启多个 websocket 服务的话 只要在一个文件中,输入 new Worke ...

  6. 【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)

    概念简介 Paxos是一种基于消息传递具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一. 发展历史 Paxos算法的发展历史追溯到古希腊,当时有一个名为"Pax ...

  7. IDEA-日志管理神器

    Grep Console-插件的好处就在于能使控制台输出日志时,可以直接修改插件中定义好的规则,也可以根据自己定义的规则,输出不同的颜色.这样就可以将错误信息标记成显眼的颜色,方便查看,提高bug寻找 ...

  8. Net DB Web多级缓存的实现

    1.客户端缓存(浏览器缓存) HTTP有一套控制缓存的协议-RFC7234,其中最重要的就是cache-control这个相应报文头,服务器返回时,如果Response带上 cache-control ...

  9. Java面试——Linux

    一.如果知道一个文件名称,怎么查这个文件在 Linux下的哪个目录,如:要查找 tnsnames.ora文件 1 find / -name tnsnames.ora 2 #还可以用locate 来查找 ...

  10. tModLoader随机掉落模组编写

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 1. 整体思路 目标是实 ...