2023-01-06:给定一个只由小写字母组成的字符串str,长度为N, 给定一个只由0、1组成的数组arr,长度为N, arr[i] == 0表示str中i位置的字符不许修改, arr[i] ==
2023-01-06:给定一个只由小写字母组成的字符串str,长度为N,
给定一个只由0、1组成的数组arr,长度为N,
arr[i]等于 0 表示str中i位置的字符不许修改,
arr[i] 等于 1表示str中i位置的字符允许修改,
给定一个正数m,表示在任意允许修改的位置,
可以把该位置的字符变成a~z中的任何一个,
可以修改m次。
返回在最多修改m次的情况下,全是一种字符的最长子串是多长。
1 <= N, M <= 10^5,
所有字符都是小写。
来自字节。
答案2023-01-06:
尝试全变成a一直到全变成z,遍历26次。每次滑动窗口。
时间复杂度:O(N)。
空间复杂度:O(1)。
代码用rust和solidity编写。
代码用rust编写。代码如下:
use rand::Rng;
use std::{iter::repeat, vec};
fn main() {
let str = "bbbcdbcade";
let mut arr = vec![1, 1, 0, 1, 0, 1, 0, 0, 1, 0];
let m = 4;
let ans = max_len2(&str, &mut arr, m);
println!("ans = {}", ans);
let nn: i32 = 100;
let rr: i32 = 5;
let test_time: i32 = 5000;
println!("测试开始");
for i in 0..test_time {
let n = rand::thread_rng().gen_range(0, nn) + 1;
let m = rand::thread_rng().gen_range(0, n) + 1;
let str = random_string(n, rr);
let mut arr = random_array(n);
let ans1 = max_len1(&str, &mut arr, m);
let ans2 = max_len2(&str, &mut arr, m);
if ans1 != ans2 {
println!("出错了!{}", i);
println!("str = {}", str);
println!("arr = {:?}", arr);
println!("m = {}", m);
println!("ans1 = {}", ans1);
println!("ans2 = {}", ans2);
break;
}
}
println!("测试结束");
}
// 暴力方法
// 为了测试
fn max_len1(str1: &str, arr: &mut Vec<i32>, m: i32) -> i32 {
let s = str1.as_bytes();
let n = s.len() as i32;
let mut ans = 0;
for c in 'a' as u8..='z' as u8 {
for i in 0..n {
let mut j = n - 1;
while j >= i {
if ok(s, i, j, c, arr, m) {
ans = get_max(ans, j - i + 1);
break;
}
j -= 1;
}
}
}
return ans;
}
// 为了测试
fn ok(s: &[u8], l: i32, r: i32, c: u8, arr: &mut Vec<i32>, mut m: i32) -> bool {
for i in l..=r {
if s[i as usize] == c {
continue;
}
if arr[i as usize] == 0 || m == 0 {
return false;
}
m -= 1;
}
return true;
}
// 正式方法
fn max_len2(str1: &str, arr: &mut Vec<i32>, m: i32) -> i32 {
let s = str1.as_bytes();
let n = s.len() as i32;
let mut ans = 0;
for aim in 'a' as u8..='z' as u8 {
// 右边界
// [l..r)
let mut r = 0;
// 用了几次修改了
// change == m 用完的时候
let mut change = 0;
for l in 0..n {
// l......r ->
while r < n {
if s[r as usize] == aim {
r += 1;
continue;
}
// s[r] != aim
if arr[r as usize] == 0 || change == m {
break;
}
// s[r] != aim && arr[r] == 1 && change < m
change += 1;
r += 1;
}
// l....r-1 r
// X l+1
ans = get_max(ans, r - l);
if s[l as usize] != aim && arr[l as usize] == 1 {
change -= 1;
}
// r r
// l l
// X
r = get_max(r, l + 1);
}
}
return ans;
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
// 为了测试
fn random_string(n: i32, r: i32) -> String {
let mut arr = String::new();
for _i in 0..n {
arr.push((rand::thread_rng().gen_range(0, r) as u8 + 'a' as u8) as char);
}
return arr;
}
// 为了测试
fn random_array(n: i32) -> Vec<i32> {
let mut arr: Vec<i32> = vec![];
for _i in 0..n {
arr.push(rand::thread_rng().gen_range(0, 2));
}
return arr;
}

代码用solidity编写。代码如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Hello{
function main() public pure returns (int32){
bytes memory s = "bbbcdbcade";
int32[] memory arr = new int32[](10);
arr[0] = 1;
arr[1] = 1;
arr[2] = 0;
arr[3] = 1;
arr[4] = 0;
arr[5] = 1;
arr[6] = 0;
arr[7] = 0;
arr[8] = 1;
arr[9] = 0;
int32 m = 4;
return maxLen2(s,arr,m);
}
// 正式方法
function maxLen2(bytes memory s, int32[] memory arr, int32 m) public pure returns (int32){
int32 n = int32(int(s.length));
int32 ans = 0;
for (bytes1 aim = 'a'; aim <='z'; aim = bytes1(uint8(aim)+1)) {
// 右边界
// [l..r)
int32 r = 0;
// 用了几次修改了
// change == m 用完的时候
int32 change = 0;
for (int32 l = 0; l < n; l++) {
// l......r ->
while (r < n) {
if (s[uint32(r)] == aim) {
r++;
continue;
}
// s[r] != aim
if (arr[uint32(r)] == 0 || change == m) {
break;
}
// s[r] != aim && arr[r] == 1 && change < m
change++;
r++;
}
// l....r-1 r
// X l+1
ans = getMax(ans, r - l);
if (s[uint32(l)] != aim && arr[uint32(l)] == 1) {
change--;
}
// r r
// l l
// X
r = getMax(r, l + 1);
}
}
return ans;
}
function getMax(int32 a,int32 b) public pure returns (int32){
if(a>b){
return a;
}else{
return b;
}
}
}

2023-01-06:给定一个只由小写字母组成的字符串str,长度为N, 给定一个只由0、1组成的数组arr,长度为N, arr[i] == 0表示str中i位置的字符不许修改, arr[i] ==的更多相关文章
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- js 正则只允许小写字母、数字、点、中短划线
正则表达式如下: /^[a-z0-9\.-]*$/g 可用如下语句验证: alert(/^[a-z0-9\.-]*$/g.test('abc123.45a-b')); //true alert(/^[ ...
- Python3基础 str casefold 返回全是小写字母的新字符串
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- python3 替换字符串中指定位置字符
大家都知道字符串在python中是不可变数据类型,那么我们如何替换字符串中指定位置的字符呢? 字符串转换列表替换并转换解决: def replace_char(string,char,index): ...
- 【转载】C#中string类使用Remove方法来移除指定位置的字符
在C#的字符串操作过程中,有时候需要将字符串中指定位置的字符移除,此时就可能使用到字符串类string类中的Remove方法,此方法允许指定移除开始的开始的索引位置,以及移除的长度信息等,共有2个重载 ...
- LeetCode387First Unique Character in a String字符串中第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...
- android 中获取当前焦点所在屏幕中的位置 view.getLocationOnScreen(location)
final int[] location = new int[2]; view.getLocationOnScreen(location); final int[] location = new in ...
- Leetcode#709. To Lower Case(转换成小写字母)
题目描述 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: 输入: "Hello" ...
- bzoj 4032(A的一个最短的子串,它不是B的子串 || A的一个最短的子串,它不是B的子序列 || A的一个最短的子序列,它不是B的子串||A的一个最短的子序列,它不是B的子序列)
在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以不连续的一 ...
随机推荐
- Python第十章实验报告
一.实验对象:<零基础学Python>6道实例和2道实战 二.实验环境:IDLE Shell 3.9.7 三.实验目的:学习如何在Python中进行文件和目录的相关操作 四.实验过程: 实 ...
- Visual Studio-截断类错误
Visual Studio-截断类错误 传输数据的目标端,将提示的错误的表对应的截断字段的长度增大,重新创建表 并且,对于Visual 传输节点里面,双击红色报错的节点,然后对于数据源右键,接着选择& ...
- Tcp网络模型
要摸清网络,那么第一步肯定是要清楚网络协议的分层结构,用上帝视角来看网络. 对于同一台设备上的进程间通信,有很多种方式,比如有管道.消息队列.共享内存.信号等方式,而对于不同设备上的进程间通信,就需要 ...
- IDEA如何使用Maven不通过模板创建javaWeb项目
IDEA如何使用Maven不通过模板创建javaWeb项目 1.创建项目 进入IDEA,点击"项目">"新建项目",填写项目信息,最后点击"创建 ...
- 什么是RPA?RPA能干什么?
一.什么是RPA什么是RPA? RPA的全称为机器人流程自动化(Robotic Process Automation),即:"机器人流程自动化",是一种智能化的企业流程管理系统.R ...
- 【公式编辑测试】生成函数常用性质及其他(普通生成函数指数生成函数Dirichlet生成函数)
目录 定义 普通生成函数OGF 指数生成函数 EGF Dirichlet生成函数 Notation OGF OGF property some OGF instances EGF EGF proper ...
- Django笔记一之运行系统、创建视图并访问
从这一篇笔记开始将根据 Django 的官方文档,阅读整理之后,出一系列笔记教程,用作新手入门教程或者自己做查阅. 此次 Django 的版本为 3.2,且之后的一系列笔记都将以这个版本为基础,做功能 ...
- Solon2 接口开发: 分布式 Api Gateway 开发预览
建议使用专业的分布式网关产品,比如: nginx apisix [推荐] k8s ingress controller 等... 对 Solon 来讲,只有 Gateway:它调用本地接口时,则为本地 ...
- IP代理的使用 IP代理爬取视频
IP代理的使用 IP代理的分类 透明代理:目标网址知道你使用了代理并且知道你的源IP地址 匿名代理:匿名程序比较低 也就是网站知道你使用代理 但是查不出来源IP地址 高匿代理:网站不知道你使用了代理 ...
- day13-SpringBoot整合MyBatis/Plus
SpringBoot整合MyBatis/Plus 1.SpringBoot整合MyBatis 1.1整合案例 需求:整合SpringBoot和Mybatis,向数据库中查询数据. 项目结构: 1.1. ...