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. c#获取文本中的内容

    string path = HttpContext.Current.Server.MapPath("/文件夹/名称.txt"); string ss = File.ReadAllT ...

  2. Arduino优化 减少重复代码 例2

    Example->Blink: void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUI ...

  3. vue横向滑动

    代码 <template> <div> <!-- 左侧的滑动模块 --> <div class="scroll-box" :style=& ...

  4. laravel groupBy 分页

    $model=DB::table('tablebname') ->where(function($query) use ($res){ $query->where('xx','xx'); ...

  5. 重学c#系列—— explicit、implicit与operator[三十四]

    前言 我们都知道operator 可以对我们的操作符进行重写,那么explicit 和 implicit 就是对转换的重写. 正文 explicit 就是强制转换,然后implicit 就是隐式转换. ...

  6. 如何在mac上使用idea做大数据开发

    1 软件包下载 jdk1.8 (jdk1.8.0_231) idea(包括2018,2019) (ideaIC-2019.3.3/ideaIC-2018.3.5) 汉化包:汉化包.rar maven3 ...

  7. react组件之非受控组件和高阶组件

    非受控组件 受控组件和非受控组件的区别 ----- value import React, { Component } from 'react' export default class extend ...

  8. rocketmq-spring : 实战与源码解析一网打尽

    RocketMQ 是大家耳熟能详的消息队列,开源项目 rocketmq-spring 可以帮助开发者在 Spring Boot 项目中快速整合 RocketMQ. 这篇文章会介绍 Spring Boo ...

  9. 通俗易懂的spring事务的传播机制讲解!

    spring事务理解 前提两个都是事务的方法,并且两个方法会进行调用,调用方统一使用required 举例有两个方法: required 如果当前上下文存在事务,被调用方则加入该调用方的事务,没有的话 ...

  10. Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答

    Mybatis 获取自增主键 今天开发的时候遇到一个疑惑,业务场景是这样的, 但是百度好久没有找到合适的解答,于是自己向同事了解,感觉还不错,因此写上了这个文章 有一个表A和一个表B A就是一个主表, ...