【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等

news2025/1/16 14:07:43

文章目录

  • 一、压缩字符串
    • 思路
  • 二、仅执行一次字符串交换能否使两个字符串相等
    • 思路1:计数法
    • 思路2:模拟法
  • 总结


一、压缩字符串

点我直达~

在这里插入图片描述

思路

使用双指针法

大致过程如下:

  • 使用双指针,分别读(read),写(write)指针,读指针不断向后走,当read指针走到最后位置处时,或read和read的下一个位置与当前位置不相等时,说明该read指针走到了某一串相同子串的最后位置处。
  • 此时write指针开始记录具体的字符,给定一个left指针记录当前位置,此时每一个子串的长度都是 read - left +1
  • 使用短除法将子串的长度记录下来,再进行逆置即可。

具体操作如下:

  • 1.给定两个指针write 和 left(left指针记录每一个子串的开始位置),分别指向第一个元素的位置。
  • 2.使用read指针,遍历字符串,当read遇到其后面一个字符与当前字符不等,或者read走到末尾时,此时将write指针记录当前子串的字符,以及长度,那就让write一边记录一边往后走。
  • 3.当write指针开始记录子串的长度时,给一个下标begin,这个begin就是记录子串的长度的起始位置,比如一个串的长度为:123,需要记录到chars数组的是[“1”,“2”,“3”],begin记录着"1"下标的位置。
  • 4.使用短除法将某一个串的长度的每一位记录下来,然后逆置,逆置的开始是begin,结尾是write。
  • 5.因为write总是向后走,知道走到记录完所有的字符以及每一个相同的字符串的长度,则最终返回write的长度即可

具体代码如下:

class Solution {
public:
    int compress(vector<char>& chars) 
    {
        int write = 0,left = 0;
        for(int read = 0;read<chars.size();++read)
        {
            if(read == chars.size()-1 ||
             chars[read]!=chars[read+1])
            {   
                chars[write++] = chars[read];//存储字符
                int begin = write; // 逆置的左下标
                
                int n = read - left + 1 ; 
                if(n>1)
                {
                    while(n)
                    {
                        chars[write++] = (n%10) + '0';
                        n/=10;
                    }
                    //逆置的右下标是write
                    reverse(&chars[begin],&chars[write]);
                }
                left = read+1;
            }
        }
        return write;
    }
};

时间复杂度:O(n),空间复杂度O(1)

二、仅执行一次字符串交换能否使两个字符串相等

点我直达~

在这里插入图片描述

思路1:计数法

  • 情况1:如果两个字符串的长度不同,那么不管怎么交换一定不等,返回false
  • 情况2:如果两个字符串的长度相同:
    • 情况1:如果不相同的字符超过两个,或者不相同的字符只有一个,那么两个字符串不管怎么交换字符一定不等,返回false
    • 情况2:如果不相同的字符恰好为两个,此时有两种方法解决:
      • 1.交换这两个不相同的字符的位置,如果交换后s1 == s2,返回true,否则false。
      • 2.判断 s1[i] == s2[j] ,s1[j] == s2[i]是否满足即可。

具体请看下面代码:

class Solution {
public:
    bool areAlmostEqual(string s1, string s2)
    {
        //1.相等,true
        if(s1 == s2)
            return true;
        //2.长度不等,false
        if(s1.size() != s2.size())
            return false;
        
        //3.遍历s1和s2,如果发现有两个以上字母不同,不管怎么交换都不等       
        vector<int> v1; // 两个下标
        int count = 0;//计算s1和s2有几个不等的字母
        for(int i = 0;i<s1.size();++i)
        {
            if(s1[i]!=s2[i])
            {
                ++count;
                v1.push_back(i);
            }
        }

        //如果不是只有两个字母不同,不管怎么交换一定不等。
        if(count !=2)
            return false;

        return s1[v1[0]] == s2[v1[1]] && 
        s1[v1[1]] == s2[v1[0]] ;

        //下面的操作也可
         //swap(s2[v1[0]],s2[v1[1]]);
        // if(s1 == s2)
        //     return true;

        // return false;
    }
};

思路2:模拟法

模拟法整体思路与计数法大致相同
给定两个初始值pos1 ,pos2均为 -1,记录两个字符串不同的字符的下标。

  • 如果不同位置超过两个或者只有一个,返回false
  • 如果不同位置为两个或者没有不同位置,返回true

具体请看下面代码:

class Solution {
public:
    bool areAlmostEqual(string s1, string s2)
    {
        int n = s1.size(),pos1 = -1,pos2 = -1;
        for(int i = 0;i<n;++i)
        {
            if(s1[i] == s2[i])
                continue;

            if(pos1 == -1)
                pos1 = i;
            else if(pos2 == -1)
                pos2 = i;
            
            //该情况是超过两个不同的字符
            else
                return false;
        }

            //该情况是没有不同的字符
        if(pos1 == -1)
            return true;
            //该情况是只有一个不同的字符
        if(pos2 == -1)
            return false;
        
            //该情况是正常情况
        return s1[pos1] == s2[pos2] && s1[pos2] == s2[pos1];
    }
};

总结

通过写今天的两道题,重新认识了双指针法的厉害的地方,哪哪都可以考虑双指针法。

比如:排序,字符串逆置,字符串压缩等等,有关字符串的题都可以考虑一下双指针法
还有只要涉及到两个字符串中的两个字符的问题,都可以进行下标的模拟,或者计数法来实现。

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

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

相关文章

mPak的使用文档

mpak介绍 mpak是一种文件格式&#xff0c;同时也是一款虚幻引擎插件&#xff0c;该插件提供了打包、解析和挂载mPak文件的方法&#xff0c;将不同平台的软件包和未编译的资源集成到mPak文件中&#xff0c;该文件具有跨平台兼容性。它支持不同阶段的挂载&#xff0c;例如在编辑…

monaco-editor插件自定义编辑器内容颜色

开始之前先说一下他的自定义内容颜色的api monaco.languages.setMonarchTokensProvider((languageId: string, languageDef: IMonarchLanguage | Thenable<IMonarchLanguage>)) 参数解析&#xff1a;接收两个参数 一个是你要设置的编辑器语言种类&#xff0c;可以是sq…

Ubuntu14.04安装igH EtherCAT Master

一、下载EtherCAT安装包 安装包下载路径&#xff1a;EtherLab EtherCAT Master / Code / [334c34]&#xff0c;打开后点击Download下载 二、安装前置依赖库 最好切换到root用户进行下列步骤 apt-get install autoconf automake libtool net-tools三、编译安装 解压安装包&a…

excel如何折叠展开行列?

Excel可以使用分组功能来实现折叠展开行列的效果&#xff0c;同时可以在单元格内添加号或-号来进行操作。 具体步骤如下&#xff1a; 1. 选中需要进行折叠展开的行或列&#xff0c;右键选择“分组”。 2. 在弹出的“分组”对话框中&#xff0c;选择“行”或“列”&#xff0…

『赠书活动 | 第十一期』清华社赞助 | 《Python系列丛书》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第十一期』 本期书籍&#xff1a;《Python系列丛书》 公众号赠书&#xff1a;第三期 参与方式&#xff1a;关注公众号&#xff1a;低调而奢…

逻辑回归分类器-创建词向量-情感分析

题目 请使用您今天学习的逻辑回归分类器对下面的聊天机器人数据进行自动分类。&#xff08;3分&#xff09; https://github.com/songys/Chatbot_data&#xff08;ChatbotData.csv文件&#xff09; https://raw.githubusercontent.com/songys/Chatbot_data/master/ChatbotDa…

【职业人生】如何有效的在职场当中避免工作失误和提高个人发展

《左传宣公二年》&#xff1a;“人谁无过&#xff0c;过而能改&#xff0c;善莫大焉。”古往今来&#xff0c;多少人犯过错误。强大如“智绝”的诸葛孔明&#xff0c;也有街亭之失。职场人更是难免会在工作中出现失误。 在职场生涯当中避免不了在工作当中带来的失误&#xff0c…

【Hadoop综合实践】手机卖场大数据综合项目分析

&#x1f680; 本文章实现了基于MapReduce的手机浏览日志分析 &#x1f680; 文章简介&#xff1a;主要包含了数据生成部分&#xff0c;数据处理部分&#xff0c;数据存储部分与数据可视化部分 &#x1f680; 【本文仅供参考】其中需求实现的方式有多种&#xff0c;提供的代码并…

从0到1搞定在线OJ

目录 一、在线OJ的的原理 二、在线OJ的使用规则 三、注意事项 1.关于作弊 2.如何防止作弊 3.输入输出格式 4.换行问题 四、经典在线OJ坑人题目以及博主被坑经历 五、提交不成功及解决方法 六、如何得心应手的拿下OJ系统 七、在线OJ的骗分技巧 在线OJ&#xff08;Onl…

管理项目-查询数据

人事管理项目-查询数据模块 后端实现配置文件实体类Dao层测试前端实现1&#xff0e;创建Dept页面2&#xff0e;修改路由3 测试 后端实现 配置文件 在application.yml文件中配置数据库连接、JPA及端口等信息&#xff0c;代码如下&#xff1a; 实体类 配置完成后建立和表结构…

“出海热”仍在持续,进军东南亚市场谁能率先突围?

在油改电的趋势下&#xff0c;伴随钠电池车型的推出&#xff0c;电动两轮车市场被进一步激活。据艾瑞咨询不完全统计与估算&#xff0c;2022年国内两轮电动车销量约5010万辆&#xff0c;较去年增长15.2%&#xff0c;预计2023年销量达到5400万辆。持续增长的销量足以说明当下的国…

JeecgBoot低代码平台 3.5.2,仪表盘版本发布!重磅新功能—支持在线拖拽设计大屏和门户

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

北京君正案例:数传网关的集大成者—积木式边缘网关

数传网关的集大成者 USR-M300产品集成了数据的边缘采集、计算、主动上报和数据读写&#xff0c;联动控制&#xff0c;IO采集和控制等功能&#xff0c;采集协议包含标准Modbus协议和多种常见的PLC协议&#xff0c;以及行业专用协议&#xff1b;主动上报采用分组上报方式&#xf…

如何靠自学成为一名网络安全工程师?

1. 前言 说实话&#xff0c;一直到现在&#xff0c;我都认为绝大多数看我这篇文章的读者最后终究会放弃&#xff0c;原因很简单&#xff0c;自学终究是一种适合于极少数人的学习方法&#xff0c;而且非常非常慢&#xff0c;在这个过程中的变数过大&#xff0c;稍有不慎&#…

电脑提示d3dcompiler_47.dll缺失怎么修复?

d3dcompiler_47.dll是 Microsoft 的 DirectX 11 核心组件之一&#xff0c;它主要用于编译和运行 Direct3D 11 应用程序和游戏。如果您的系统中缺少这个 DLL 文件&#xff0c;可能会导致一些程序无法正常运行&#xff0c;很多游戏跟图形处理软件都会运用到。如果电脑提示“找不到…

软考A计划-系统架构师-官方考试指定教程-(1/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Elasticsearch数据库索引及数据操作

目录结构 前言数据库初始化索引操作创建索引获取索引获取所有索引删除索引 数据操作新增POST方式PUT方式 查询主键查询全量查询search 修改全量覆盖部分修改 删除 前言 Elasticsearch安装成功情况下&#xff1b;使用Postman请求操作数据库&#xff1b;浏览器插件实现Elasticsea…

Ubuntu做深度学习+ros怎么分区

正好要重装系统了&#xff0c;学习以下怎么分区 买了铠侠rc20 &#xff0c; 1T用来做Ubuntu系统盘 整理一下要安装的东西&#xff1a; 1.要装cuda &#xff0c;6G&#xff08; 安装在 /usr/local/cuda-11.1 &#xff09; 挂载点 /usr: 存放用户程序&#xff0c;一般在/usr/…

轨道列车自动驾驶和汽车自动驾驶的区别

轨道列车自动驾驶和汽车自动驾驶在一些方面存在明显的区别&#xff0c;主要是由于它们在运行环境和技术要求上的不同。以下是一些主要区别&#xff1a; 运行环境&#xff1a;轨道列车通常在封闭的轨道系统上运行&#xff0c;与其他车辆和行人的交互相对较少。相比之下&#xf…

华为企业组网实例:VRRP+MSTP典型组网配置

华为企业组网实例&#xff1a;VRRPMSTP典型组网配置 VRRPMSTP典型组网配置实验拓扑一、VLAN配置SW3配置SW4配置 二、Trunk配置SW3配置SW4配置SW1配置SW2配置 三、链路聚合四、MSTP配置公共配置SW1配置SW2配置分别在SW3、SW4上面验证 五、VRRP配置sw1配置sw2配置 六、VRRPMSTP的…