【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

news2025/1/16 17:54:33

删除字符串中的子串或者字符以满足题意要求

  • 1234. 替换子串得到平衡字符串
  • 680. 验证回文串
  • 917. 仅仅反转字母

1234. 替换子串得到平衡字符串

题目链接:1234. 替换子串得到平衡字符串
题目内容:
在这里插入图片描述
题目中给出了平衡字符串的定义——只有’Q’,‘W’,‘E’,'R’四种字符,并且每种字符的数量都是n/4。但是现在给出一个字符串s,它不一定是平衡字符串。如果不是就要通过替换其中一个子串,使其成为平衡字符串。将字符串s看作是待替换部分s1和剩下的部分s2,将s1替换成其他字符串后,能够保证新的s1插入s2后四种字符的数量都是n/4。新的s1插入s2只能增加字符的数量而不能减少字符的数量,因此s2中四种字符的数量均要≤n/4
这个题目使用滑动窗口,滑动窗口内的子串即待删除的s1。其下标用left和right表示,s1是s中[left,right)这一段子串。滑动窗口滑动的过程如下:

  • 1、先固定left,然后right向右移动,移动的同时字符s[right]的数量-1,直到四种字符数量均≤n/4——此时找到了[left,right)这一段s1,使得s中除s1外,四种字符数量均≤n/4;
  • 2、此时逐步右移left,缩小滑动窗口(即s1)的长度,以便找到最短的s1;同时字符s[left]的数量+1,并判s-s1中四种字符的数量是否均≤n/4;
  • 3、每找到一个满足条件的[left,right)滑动窗口,就需要记录窗口的长度,并记录最小值;

代码如下(C++):

class Solution {
public:
	//判断四种字符的数量是否均≤n/4
    bool check(vector<int>& cnt , int num){
        if(cnt['Q' - 'A'] > num
           ||cnt['E' - 'A'] > num
           ||cnt['W' - 'A'] > num
           ||cnt['R' - 'A'] > num)
        return false;
        
        return true;
    }
    
    int balancedString(string s) {
    	//先统计s中四种字符的数量
        vector<int> cnt(26,0);
        for(char ch : s)
            cnt[ch-'A']++;		
        int num = s.size() / 4;
        //如果一开始就小于等于【实际上是等于】就直接返回0,不需要替换
        if(check(cnt, num))
            return 0;
        //记录最小长度
        int ans = s.size();
        //滑动窗口更新过程
        for(int left = 0, right = 0; left < s.size(); left++){
        	//right右移直到滑动窗口外四种四字符均≤n/4
            while(right < s.size() && !check(cnt, num)){
                cnt[s[right] - 'A']--;
                right++;
            }
            //上面循环结束可能是right=s.size(),也可能是满足条件了
            //如果是right=s.size()了,right不能右移了,之后left右移的过程中只能使得滑动窗口外四种字符的数量增加
            //如果一旦有left使得有字符数量>n/4,left继续右移已经没有意义,之后的滑动窗口都不满足要求,提前跳出循环
            if(!check(cnt,num))
                break;
            //更新长度
            ans = min(ans, right - left);
            cnt[s[left] - 'A']++;
        }
        return ans;        
    }
};

680. 验证回文串

题目链接:680. 验证回文串
题目内容:
在这里插入图片描述
判断一个字符串是否是回文串的时候,使用的是双指针,一个left从下标0开始,一个right从s.size()-1开始,然后如果s[left] == s[right],left++,right–;直到left >= right,遍历完s中的字符。
现在题目是要求我们最多删除一个字符串,判断s是否是回文串。此时有三种情况:

  • 1、s本身就是回文串,能够按照上述的判断过程逐字符对比判断;
  • 2、s本身不是回文串,但是删除一个字符后能够是回文串:s不是回文串,肯定会出现s[left] !=s [right],此时要么删除s[left],然后判断s[left+1~right]是否是回文串;要么删除s[right],判断s[left~right-1]是否是回文串; 这两个只要有一个是回文串即可;【也可能两个都是回文,比如acac删除a得到cac,删除c得到aca,都是回文】
  • 3、s不是回文串,不管删除哪个字符都不能成为回文串——上述第二种情况中,如果不管删除s[left]还是s[right],剩下的都不是回文串,那么如果考虑继续遍历,删除其他字符串,但是s[left] != s[right],不管再去删除s[left+1~right-1]中的哪个字符,都不能使得s变成回文串。

代码如下(C++):

class Solution {
public:
	//判断left~right这一段子串是否是回文串
    bool ispalindrome(int left, int right, string& s){
        while(left<right){
            if(s[left] != s[right])
                return false;
            left++;
            right--;
        }
        return true;
    }
    bool validPalindrome(string s) {
        int left = 0, right = s.size()-1;
        //前后逐字符对比
        while(left < right){
        	//如果相等就left++,right--
            if(s[left] == s[right]){
                left++;
                right--;
            }
            //如果不相等,就去判断left~right-1和left+1~right这两段子串是否是回文串
            else 
            	return ispalindrome(left,right - 1,s) || ispalindrome(left+1,right,s);
        }
        return true;
    }
};

917. 仅仅反转字母

题目链接:917. 仅仅反转字母
题目内容:
在这里插入图片描述
题目说的是英文字母位置反转。看题目以为这个位置反转和之前的反转单词一样,只是把非英文的字符当作单词的分隔符……结果原来是和这个反转字符串类似。只是遇到非英文字母的字符直接跳过不处理。
先看看例子:
在这里插入图片描述
因此这里的位置反转,也是双指针left和right,在s[left]和s[right]都是英文字母的时候,二者交换;如果不是英文字母就跳过,不处理,代码如下(C++):

class Solution {
public:
	//判断是否是英文字母
    bool check_ch(char ch){
        if(ch - 'a' >= 0 && ch - 'a' < 26)
            return true;
        if(ch - 'A' >= 0 && ch - 'A' < 26)
            return true;
        return false;
    }
    string reverseOnlyLetters(string s) {
    	//双指针遍历s中每个字符
        for(int i = 0, j = s.size() -1 ; i < j;){
        	//s[i]和s[j]都是英文字母的时候,交换位置
            if(check_ch(s[i]) && check_ch(s[j])){
                swap(s[i],s[j]);
                i++;
                j--;
            }
            else {
            	//不是英文字母就跳过
                if(!check_ch(s[i]))
                    i++;
                if(!check_ch(s[j]))
                    j--;
            }
        }
        return s;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】详解std::thread

2023年9月10日&#xff0c;周日下午开始 2023年9月10日&#xff0c;周日晚上23:35完成 虽然这篇博客我今天花了很多时间去写&#xff0c;但是我对std::thread有了一个完整的认识 不过有些内容还没完善&#xff0c;以后有空再更新.... 目录 头文件类的成员类型方法(construc…

GDB用法(三)

预备 测试代码参照GDB用法(二) 命令历史 可以将命令历史保存到文件中 (show history) 展示当前gdb中history的设置信息 设置expansion (set history expansion) 打开历史扩展 能使用历史处理命令对历史数据进行处理, 暂不细究 (show history expansion) 展示历史扩展配置…

《JDK17新特性和代码案例演示》

《JDK17新特性和代码案例演示》 &#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全…

sqli --【1--10】

Less-1&#xff08;联合查询&#xff09; 1.查看是否有回显 2.查看是否有报错 3.使用联合查询&#xff08;字符注入&#xff09; 3.1判断其列数 3.2 判断显示位置 3.3敏感信息查询 Less-2&#xff08;联合查询&#xff09; 1.查看是否有回显 2.查看是否有报错 3.使用…

[学习笔记]词向量模型-Word2vec

参考资料&#xff1a; 【word2vec词向量模型】原理详解代码实现 NLP自然语言处理的经典模型Word2vec 论文背景知识 词的表示方法 One-hot Representation&#xff1a;独热表示 简单&#xff0c;但词越多&#xff0c;向量越长。且无法表示词与词之间的关系。 论文储备知识-pr…

Ae 效果:CC Scatterize

模拟/CC Scatterize Simulation/CC Scatterize CC Scatterize&#xff08;CC 散射&#xff09;主要用于模拟将对象散射为颗粒状的效果。 CC Scatterize 的工作原理是&#xff1a;对源图像的 Alpha 通道先进行融解 Dissolve&#xff0c;从而产生随机颗粒&#xff0c;因此改变了源…

安卓系列机型 另类体验第三方系统 DSU操作步骤解析 不影响主系统开启第二系统

dsu loader即 动态系统更新&#xff0c;可以在使用动态分区的安卓设备上&#xff0c;不影响原来系统的同时安装一个副系统&#xff0c;用于体验最新的原生安卓系统。可以不影响主系统的基础上体验其他gsi第三方。DSU 依赖于 Android 动态分区功能&#xff0c;并要求 GSI 作为可…

博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池

博客系统&#xff08;二&#xff09; 博客系统获取当前用户的信息对密码进行加密和解密的操作设置统一的数据返回格式设置未登录拦截设置线程池 博客系统 博客系统是干什么的&#xff1f; CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统&#xff0c;这是…

精品基于SpringCloud实现的高校招生信息管理系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的高校招生信息管理系统-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版本&#x…

【环境配置】基于Docker配置Chisel-Bootcamp环境

文章目录 Chisel是什么Chisel-Bootcamp是什么基于Docker配置Chisel-Bootcamp官网下载Docker安装包Docker换源启动Bootcamp镜像常用docker命令 可能产生的问题 Chisel是什么 Chisel是Scala语言的一个库&#xff0c;可以由Scala语言通过import引入。 Chisel编程可以生成Verilog代…

C高级day3(shell指令)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.定义一个变量&#xff0c;把第11个外部参数的值&#xff0c;赋值给该变量并输出&#xff0c;再输出外部参数的个数 var3${11} echo $var3 echo $# 2.定义一个变量num&#xff0c;使用num获取root用户&#xff0c;…

腾讯事务处理技术验证系统3TS-Coo模板安装文档说明文档(小白向,简单轻松就能上手)

本篇文章将详细说明3TS-Coo模板的安装和使用&#xff0c;帮助您快速上手项目 第一部分是简单的基础Docker相关概念&#xff0c;精炼的几句小白话快速理解即可&#xff1b; 第二部分是快速安装项目环境的安装文档&#xff0c;简单几行命令搞定&#xff0c;小白也能轻松上手&…

12. Xaml Calendar控价 时间控件-->像挂历

1.运行图片 2.运行源码 a.xaml 源码 <Grid Name="Grid1"><!--DisplayMode="Month" 按照什么模式显示DisplayDateStart="2023-2-10" 显示时间的起始时间DisplayDateEnd="2023-8-30" 显示时间的结束时间IsTodayH

MyBatis-Plus-入门操作(1)

MyBatis-Plus-入门操作 2.1常见注解 约定大于配置 mp扫描实体类基于反射的方式作为数据库表的信息。 默认的约定 类名驼峰转下划线名字为id的是主键属性名进行驼峰转换成下划线 要是不遵循约定的话就需要对应的注解进行修改。 表的名字和 实际的表的名字是不一致的 Table…

Scrum看板工具-敏捷看板?

​ 敏捷看板 看板是一个团队共享的工作区&#xff0c;在看板上团队可以进行实时的工作任务协同&#xff0c;团队的工作以卡片的形式体现。通过泳道和任务列表组织管理。需求、任务、问题、缺陷 都作为卡片放在看板上&#xff0c;通过看板实现可视化和透明化的 管理&#xff0…

PHP8中获取并删除数组中第一个元素-PHP8知识详解

我在上一节关于数组的教程&#xff0c;讲的是在php8中获取并删除数组中最后一个元素&#xff0c;今天分享的是相反的&#xff1a;PHP8中获取并删除数组中第一个元素。 回顾一下昨天的知识&#xff0c;array_pop()函数将返回数组的最后一个元素&#xff0c;今天学习的是使用arr…

数据结构 每日一练:选择 + 编程

目录 选择 选择题总结 特殊矩阵的压缩存储 1.对阵矩阵 2.三角矩阵 3.三对角矩阵&#xff08;带状矩阵&#xff09; 编程 选择 1. 设有一个 10 阶的下三角矩阵 A &#xff08;包括对角线&#xff09;&#xff0c;按照行优先的顺序存储到连续的 55 个存储单元中&#xff0c…

vue学习之v-if/v-else/v-else-if

v-else/v-else-if 创建 demo7.html,内容如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

图解 LeetCode 算法汇总——回溯

本文首发公众号&#xff1a;小码A梦 回溯算法是一种常见的算法&#xff0c;常见用于解决排列组合、排列问题、搜索问题等算法&#xff0c;在一个搜索空间中寻找所有的可能的解。通过向分支不断尝试获取所有的解&#xff0c;然后找到合适的解&#xff0c;找完一个分支后再往回搜…

fastadmin的入门

fastadmin入门到完成项目 配置环境 1 运行环境 PHP > 7.2 且 < 7.4 (推荐PHP7.4版本) MySQL > 5.6 且 < 8.0 (需支持innodb引擎) Apache 或 Nginx 使用PHPstudy 运行该项目 写好apache伪静态规则 <IfModule mod_rewrite.c> Options FollowSymlinks -Multi…