2022-03-25:给定一个长度为 N 的字符串 S,由字符‘a‘和‘b‘组成,空隙由 ‘?‘ 表示。 你的任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符的最长子串尽可能短。
2022-03-25:给定一个长度为 N 的字符串 S,由字符’a’和’b’组成,空隙由 ‘?’ 表示。
你的任务是用a字符或b字符替换每个间隙,
替换完成后想让连续出现同一种字符的最长子串尽可能短。
例如,S = “aa??bbb”,
如果将"??“替换为"aa” ,即"aaaabbb",则由相等字符组成的最长子串长度为4。
如果将"??“替换为"ba” ,即"aababbb",则由相等字符组成的最长子串长度为3。
那么方案二是更好的结果,返回3。
S的长度 <= 10^6。
来自CMU入学申请考试。
答案2022-03-25:
根据S的长度 <= 10^6推断,复杂度是O(N)才能过。
1.左 == 右,中间问号长度是奇数。a?a变成aba。
2.左 == 右,中间问号长度是偶数。a???a变成abaaba。
3.左 != 右,中间问号长度是偶数。a???b变成ababab。
4.左 != 右,中间问号长度是大于1的奇数。a???b变成abaab或者aabab。
5.左 != 右,中间问号长度等于1。a?b的问号根据ab数量决定,谁小成全谁。相等的时候,成全左边。
先根据1,2,3,4过滤问号,再根据5过滤问号。
时间复杂度:O(N)。
代码用golang编写。代码如下:
package main
import (
"fmt"
)
func main() {
s := "aa??bbb"
ret := minContinuous2(s)
fmt.Println(ret)
}
func minContinuous2(s string) int {
if len(s) == 0 {
return 0
}
str := []byte(s)
N := len(str)
L := 0
R := -1
for i := 0; i < N; i++ {
if str[i] != '?' {
set(str, L, R)
L = i + 1
R = i
} else {
R++
}
}
set(str, L, R)
// 下面的for循环,是单独处理,条件5)
for i := 1; i < N; i++ {
if str[i] == '?' {
// baaaa?bbbbbbbba
for L = i - 1; L >= 0 && str[L] == str[i-1]; L-- {
}
for R = i + 1; R < N && str[R] == str[i+1]; R++ {
}
L = i - L - 1
R = R - i - 1
if L <= R {
str[i] = str[i-1]
} else {
str[i] = str[i+1]
}
}
}
return maxLen(str)
}
// L...R 都是?
// 如果这一坨问号,满足1)2)3)4)中的一种,就填好
// 如果满足5),就不填!a?b
func set(str []byte, L, R int) {
N := len(str)
if L > R {
return
}
if L == 0 && R == N-1 {
for i := 0; i < N; i++ {
str[i] = twoSelectOne((i&1) == 0, 'a', 'b')
}
} else if L == 0 {
for i := R; i >= 0; i-- {
str[i] = twoSelectOne(str[i+1] == 'a', 'b', 'a')
}
} else if R == N-1 {
for i := L; i < len(str); i++ {
str[i] = twoSelectOne(str[i-1] == 'a', 'b', 'a')
}
} else {
if str[L-1] == str[R+1] || L != R {
for ; L <= R; L, R = L+1, R-1 {
str[L] = twoSelectOne(str[L-1] == 'a', 'b', 'a')
str[R] = twoSelectOne(str[R+1] == 'a', 'b', 'a')
}
}
}
}
func maxLen(str []byte) int {
ans := 1
cur := 1
for i := 1; i < len(str); i++ {
if str[i] != str[i-1] {
ans = getMax(ans, cur)
cur = 1
} else {
cur++
}
}
ans = getMax(ans, cur)
return ans
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func twoSelectOne(c bool, a, b byte) byte {
if c {
return a
} else {
return b
}
}
执行结果如下:
2022-03-25:给定一个长度为 N 的字符串 S,由字符‘a‘和‘b‘组成,空隙由 ‘?‘ 表示。 你的任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符的最长子串尽可能短。的更多相关文章
- 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */
namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- C语言:利用指针解决:统计一个长度为2的字符串在另外一个字符串中出现的次数。
//统计一个长度为2的字符串在另外一个字符串中出现的次数. #include <conio.h> #include <stdio.h> #include <string. ...
- 给定一个长度为N的数组,找出出现次数大于n/2,n/3的数,要求时间复杂度O(n),空间复杂度O(1)
先讨论出现次数大于n/2的数字,如果这样的数字存在,那么这个数出现的次数大于其他数出现的次数的总和. 在数组A中,我们定义两个数据集合a1,a2.a1为出现次数大于n/2的数的集合,a2为其余数组成的 ...
- 2018/03/25 每日一个Linux命令 之 df
Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计. 就像在windows下打开我的电脑一样会统计各个磁盘一样的情况 主要用于查看磁盘空间占用情况 -- [@hong:~] ...
- 给定一个文件每一行是字符串,找出所有的逆序对,比如abc和cba是逆序的对
1 #include<iostream> 2 #include<string> 3 #define MAX 100 4 using namespace std; 5 bool ...
- 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)
需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换 ab 不替换 ba 不替换 aba 不替换 aab 替换为 ...
- 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...
- LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...
随机推荐
- gorm操作sqlite3,高并发读写如何避免锁库?
1. 场景 这两天一直被这个sqlit3困扰,起因是项目中需要有这样一个中间,中间件承担着API角色和流量转发的角色,需要接收来自至少300个agent的请求数据,和健康检测的请求. 所以当即想到用g ...
- Axios的相关应用
Axios 的案例应用 要求利用axios实现之前利用AJAX实现的验证用户是否登录的案例 鉴于这两种语法的相似性,只需要在AJAX里面的注册界面里面的script标签里面包含的代码修改为如下代码即可 ...
- 最近写了一个demo,想看看java和go语言是怎么写的
最近写了一个demo:demo的github地址 一. 简单介绍 1. Server端 它是一个WebApi服务,把它当成一个黑盒就行了. 2. MiddleServer端 是重点,它是一个WebAp ...
- JVM Dump分析
Thread Dump介绍 Thread Dump是非常有用的诊断 Java应用问题的工具.每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚 ...
- golang pprof 监控系列(1) —— go trace 统计原理与使用
golang pprof 监控系列(1) -- go trace 统计原理与使用 服务监控系列文章 服务监控系列视频 关于go tool trace的使用,网上有相当多的资料,但拿我之前初学golan ...
- 【ACM算法竞赛日常训练】DAY1题解与分析
DAY1 共四题: 月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053 Rinne Loves Edges:https://ac.nowcoder.c ...
- 从源码解析Go exec timeout 实现机制
1. 背景 环境:golang 1.9,drawn 测试使用golang exec 执行命令,并配置过期时间,测试脚本如下. 现象:执行脚本后,到超时时间后并为超时退出,反而阻塞住了 func Tes ...
- blender资源库 【自用】
1 https://www.threedscans.com A Website with a lot of photo-scanned sculptures which are free to use ...
- 线性规划与整数规划—R实现
线性规划的R语言实现 R语言在针对各类优化模型时都能快速方便的求解,对运输问题.生产计划问题.产销问题和旅行商问题等都有专门的R包来解决.线性规划与整数规划的区别主要在于对决策变量的取值约束有所不同. ...
- 随机服务系统模拟—R实现(一)
排队论--随机服务系统 日常生活中存在大量有形和无形的排队或拥挤现象,如旅客购票排队,市内电话占线等现象.排队论的基本思想是 1909 年丹麦数学家.科学家,工程师 A. K. 埃尔朗在解决自动电话设 ...