分享一道字节跳动后端面试算法题

题目:

给你一个字符串s,可以将任意一个字符转为任意一个小写字符,这个操作可有m次,问转化后的字符串中最长的相等子串长度。

案例:

s="abcdac" ,m=2,2次操作,可以转化为"abcccc" ,最长是4,返回4。

分析:

题目很好理解,但是如果对算法掌握不是很透彻或者是对滑动窗口、双指针算法学的不是很明白的同学还是有点难度的。字符串的任意字符都可以改变成其他的字符。我们优先考虑滑动窗口双指针来写

定义left和right为左右指针,定义一个字典mp来记录字符串中每个字符出现的次数。遍历一次字符串s,每次循环执行如下,将该下标元素对应的字符+1,如果right-left+1(现在窗口的长度)- mp字典中最大的数(max_value)> m ,说明不可能完成这样的操作,减去当前mp下标元素对应的字符,left+1。再一次执行right-left+1(现在窗口的长度)- mp字典中最大的数(max_value)> m的操作,直接此判断语句不符合。结束后说明right-left+1的字符串满足操作m次将任意一个字符转为任意一个小写字符。与max_length比较取最大值。

mp:保证是字符串s滑动窗口 left,right 中字符对应的字符数量

max_value:滑动窗口中字符数量的最大值

max_length:m次操作后最长的相等子串长度

题目代码:

cpp 复制代码
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
	string s;
	int m;
	cin>>s;
	cin>>m;
	unordered_map<char,int>mp;
	int left=0;
	int max_lenth=0;
	for(int right=0;right<s.size();right++)
	{
		mp[s[right]]++;
		int max_value=0;
		for(int i=0;i<26;i++)
		{
			char ch='a'+i;
			max_value=max(max_value,mp[ch]);
		}
		while(right-left+1-max_value>m)
		{
			mp[s[left]]--;
			left++;
		}
		max_lenth=max(max_lenth,right-left+1);
	}
	cout<<max_lenth<<endl;
}
相关推荐
LccKyI2 分钟前
# C# 基础编程 面试题汇总(一)
开发语言·c#
CODER03045 分钟前
win11系统编译安装cuda版llama-cpp-python(踩完所有的坑)
开发语言·python·llama
神仙别闹10 分钟前
基于C语言+SQLite 实现(控制台+图形界面)图书管理系统
c语言·开发语言·sqlite
水饺编程13 分钟前
第5章,[Win32 章节] :绘制填充区域
c语言·c++·windows·visual studio
_明月16 分钟前
汇川技术股份有限公司面试--Java外包岗
java·面试·职场和发展
水管在开花.21 分钟前
RAG:知识库问答系统教学②-零基础保姆级教程
人工智能·面试·agent·rag
何以解忧,唯有..22 分钟前
LangChain 模型调用方法总结:invoke、batch、stream 的入参与出参
开发语言·langchain·batch
SamChan9027 分钟前
Python+ReportLab自动生成PDF翻译质量审计报告:从数据到可视化的完整方案
开发语言·python·ai·pdf·wpf
深念Y28 分钟前
Makefile vs go run:Go 项目构建方式对比
java·开发语言·golang·k8s·编译·流水线·cicd
whcyhhh29 分钟前
头歌实践教学平台:数据科学与大数据技术导论(十八2)
大数据·开发语言·python