首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法-删除字符串中的公共字符

算法-删除字符串中的公共字符

作者头像
chaibubble
发布于 2018-01-02 03:25:58
发布于 2018-01-02 03:25:58
4.2K00
代码可运行
举报
运行总次数:0
代码可运行

题目: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入“They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

解题思路: 好未来那这道题做过笔试题目,首先最简单的思路就是两层循环遍历,下面将“They are students.”称为字符串1,将“aeiou”称为字符串2。每遍历到字符串2中的一个字符,就在字符串1中找到相同的字符,找到之后删除它,并将字符串1后面的字符整体向前移动1位。所以这个过程的时间复杂度是O(n^3),下面我们就可以考虑如何优化它了:

1.如何解决顺序存储结构中删除后整体移动的问题? 假设当前遍历到字符串2中的“a”,现在遍历字符串1,要求是是“a”的话就删除,那么这个要求换一个思路就是不是“a”就保留,在不申请新的空间的情况下,我们只需要把要保留的字符覆盖字符串中1原来的字符,要删除的字符不做覆盖,此时就需要有两个指针,一个在控制整体的遍历过程,一个记录要插入的位置:

可以看到,在遍历的过程中,如果没有出现要删除的字符的话,p1和p2一直在同步走(同步走的过程也是要覆盖的过程,一直在用p1的指向字符覆盖p2,只是他们指向相同,覆盖也就没有意义了),而出现了要删除的字符,p2会停下来,指示p1指向的字符要覆盖的位置,这样的话,我们就能避免每一次删除后的整体平移,这样的话时间复杂度还有O(n^2)。

2.如何避免两层遍历的嵌套? O(n^2)的时间复杂度是由遍历两个字符串产生的,能否应用一些方法避免循环嵌套的问题,引入hash表。 两个遍历嵌套的过程无非是为了找到字符串2中的字符在字符串1中是否出现,那么如果我们对字符串1建立hash表,在遍历字符串2时就可以根据hash索引直接找到要删除的字符,这样的话时间复杂度就可以降到O(n),下面考虑字符串2中出现重复字符的情况,无所谓啊,反正都是要删了的。 所以我们就能对字符串2建立一个hash表了,hash函数选择:(int)arr2[n]。在字符串2中出现的字符,在hash表中的值为1,未出现的字符表值为0。 hash表范围的选取: a :97 A :65 z :122 Z :90 标点符号还在字母之前,所以hash范围选成256就足够了。 所以总的来说,我们用一个O(256)的空间复杂度,将时间复杂度从O(n^2)将为O(n),所以如果n很大的话,这个替换是值得的。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "iostream"    

using namespace std;
void  DeleteChar(char arr1[],char arr2[]);
int main()
{   
  char str1[] = "They are students.";
  char str2[] = "aeiou";
  cout<<str1<<endl;
  DeleteChar(str1,str2);
  cout<<str1<<endl;
  getchar();
  return 0;
}
void  DeleteChar(char *arr1,char *arr2)
{
    if(arr1 == NULL && arr2 == NULL)
        return;
    //创建hash表
    int hash_table[256] = { 0 };
    char *p1 = arr1;
    char *p2 = arr2;
    int index =0;
    //遍历删除串
    while(*p2 != '\0')
    {
        hash_table[(int)*p2] = 1;
        p2++;
    }
    //遍历待删除串
    while (*p1 != '\0')
    {
        //该字符不需要删除
        if( 0 == hash_table[(int)*p1] )
        {
            arr1[index]= *p1;
            index++;
        }
        p1++;
    }
    arr1[index]='\0';
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL:DDL 数据定义语句盘点
DDL(Data Definition Language),即数据定义语句,功能就是定义数据库DATabase、表table、索引index、视图view、列column等
栗筝i
2022/12/01
6460
LAMP学习笔记-Mysql概念及命令整理
数据库显示: SHOW DATABASES; 关系型数据库对象: 库 表 索引 视图 约束 存储过程 存储函数 触发器 游标 用户 权限 事务 表: 行: row 列: column, field 字段名称,数据类型,类型修饰 字符: CHAR(n) VARCHAR(n) BINARY(n) VARBINARY(n) TEXT BLOB 数值: 精确数值,整型: TINYINT SMALLINT MEDIUMINT INT BIGINT 近似数值,浮点型: FLOAT DOUBLE 日期时间: DATE TIME DATETIME STAMP 布尔: 修饰符: UNSIGNED 无符号 NOT NULL 非空 常用 DDL: DREATE ALTER DROP DML: INSERT UPDATE DELETE 一. DCL: GRANT REVOKE 创建数据库 CREATE DATABASE database_name; CREATE DATABASE IF NOT EXISTS database_name; 删除数据库(不可逆) DROP DATABASE db_name; 创建表 CREATE TABLE tb_name(col1,col2,...); USE mydb;设定默认数据库 eg. CREATE TABLE students(Name CHAR(20) NOT NULL,AGE TINYINT UNSIGNED,Gender CHAR(1) NOT NULL); 查看表 SHOW TABLES FROM db_name; 查看表结构 DESC tb_name; 删除表 DROP TABLE tb_name; 修改表 ALTER TABLE tb_name; MODIFY CHANGE ADD eg. ALTER TABLE students ADD course VARCHAR(100); ALTER TABLE students CHANGE course Course_new VARCHAR(100) AFTER name; 二. DML: INSERT INTO tb_name (col1,col2,...) VALUES|VALUE('STRING','NUMBLE'); INSERT INTO tb_name (col1,cole,...) VALUES|VALUE('STRING','NUMBLE',...),('STRING','NUMBLE'); eg. INSERT INTO students (Name,Course)VALUES ('ZhangSan','Math'),('Lisi','English'); INSERT INTO students ('Xiaoming','gym',23,'M'); UPDATE tb_name SET column=value WHERE eg. UPDATE students SET Course='Math' WHERE Name='Xiaoming'; DELETE FROM tb_name WHERE CONDITION; 选择和投影 选择:行 投影:列 同时选择投影:一个交集 eg. SELECT Name ,Course FROM students WHERE Gender='M'; 选择 SELECT 字段 FROM tb_nameWHERE CONDITION *: 所有字段 WHERE:没有条件表示显示所有行 创建用户 CREATE USER 'USERNAME'@'HOST' DIENTIFIED BY 'PASSWORD'; DROP USER 'USERNAME'@'HOST'; HOST: IP HOSTNAME NETWORK 通配符 _:匹配任意单个字符, 172.16.0._ %:匹配任意字符, Jerry@'%' 三. DCL: GRANT pri1,pri2,... ON DB_NAEM.TB_NAME TO 'USERNAME'@'HOST'[IDENTIFIED BY 'PASSWORD']; REVOKE pri1,pri2,... ON DB_NAME.TB_NAEM FROM 'USERNAME'@'HOST'; SHOW GRANTS FOR 'USERNAME'@'HOST';
白墨石
2021/01/13
3230
Mysql基础命令01
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
mikelLam
2022/10/31
3260
SQL操作一
文章目录 1. Day01-基本的语句 1.1. 数据库简介 1.2. 什么是DB 1.3. 什么是DBMS 1.4. 数据库分类 1.5. 主流关系型数据库介绍 1.6. mysql安装 1.7. 数据库相关SQL 1.7.1. 什么是SQL 1.7.2. 连接数据库 1.7.3. 数据库操作 1.8. 表相关SQL 1.8.1. 什么是表 1.8.2. 数据库表的引擎 1.8.3. 创建表时指定引擎和字符集 1.8.4. 创建表 1.8.5. 查询所有表 1.8.6. 查询单个表 1.8.7. 查看
爱撒谎的男孩
2019/12/31
7310
【MySQL基础篇】三、表结构的操作
​ 就是创建一个表1,它的结构是和表2一样的!(但是是没有数据的,只是表结构一样)
利刃大大
2025/05/21
1990
【MySQL基础篇】三、表结构的操作
MySQL基础 — 常用命令
使用select对列进行查询时,不仅可以直接以列的原始值作为结果,而且还可以将列值进行计算后所得值作为查询结果,即select子句可以查询表达式的值,表达式可由列名、常量及算术运算符组成。 查询结果计算列显示“无列名”,一般要给计算列加列标题。 其中:表达式中可以使用的运算符有:加+、减-、乘*、除/、取余%
全栈程序员站长
2022/07/02
2.2K0
MySQL基础 — 常用命令
MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
一 库操作(文件夹) 1 数据库命名规则 可以由字母、数字、下划线、@、#、$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数字 最长128位 2 数据库相关操作 创建库 create database 数据库名 ;    (注意要引号结尾)    (默认latin1) 在创建数据库的时候也可指定编码格式,如: create database 数据库名 charset utf8;  选择数据库 use 数据库名    切换到指定数据库下  查看库 show database
用户1214487
2018/01/24
1K0
MySQL从入门到入魔(01)
###数据库 学习数据库就是学习如何和数据库软件进行交流,SQL语言就是用于程序员和数据库软件进行交流的语言. DBMS:DataBaseManagementSystem 数据库管理系统(数据库软件),包括:MySQL/Oracle/SQLServer,DB2,SQLite等 常见DBMS介绍: MySQL:开源 Oracle公司产品,08年MySQL被Sun公司收购,09年Sun公司被Oracle, 原MySQL创始人离开Oracle创建新的数据库MariaDB 市场占有率第一 Oracle:闭源 Ora
海拥
2021/08/23
3240
小白博客 MYSQL常用语句
用户管理: 1、新建用户: >CREATE USER name IDENTIFIED BY ‘ssapdrow’; 2、更改密码: >SET PASSWORD FOR name=PASSWORD(‘fdddfd’); 3、权限管理 >SHOW GRANTS FOR name;    //查看name用户权限 >GRANT SELECT ON db_name.* TO name;    //给name用户db_name数据库的所有权限 >REVOKE SELE
奶糖味的代言
2018/04/11
6400
mysql 命令完全总结 【原创】
mysql 命令完全总结 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: sunjianfeng@csxiaoyao.com QQ: 1724338257 目录导航 mysql 命令完全总结 1. 连接mysql 2. 修改密码 3. 用户管理 3.1 新建用户 3.2 用户权限管理 3.3 删除用户 4. 数据库操作 4.
CS逍遥剑仙
2018/04/28
9630
02 . Mysql基础操作及增删改查
SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
iginkgo18
2020/09/27
2K0
MYSQL 基本操作-管理数据表数据【之增,删,改】
内容: MYSQL基本操作-表的相关操作04 MYSQL 基本操作-管理数据表数据【之增,删,改】05
MIKE笔记
2023/03/23
9490
MYSQL回顾(基础)
数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,而且数据是按一定的格式存放的。 过去人们将数据存放在文件柜里,现在数据量庞大,已经不再适用。 数据库是长期存放在计算机内、有组织、可共享的数据即可。 数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种 用户共享。
VV木公子
2020/02/18
6.3K0
MySQL 学习笔记
来源:https://shockerli.net/post/1000-line-mysql-note/
用户1516716
2020/03/17
1.9K0
MySQL 常用的指令
mysql.server start 启动 mysql.server stop 关闭 quit 退出
陈雨尘
2019/05/23
1.4K0
干货!超过500行的Mysql学习笔记
本文介绍了软件测试的基本流程和常用的测试工具。软件测试的基本流程包括需求分析、设计、编程、测试、部署和维护。常用的测试工具有QTP、Selenium、JMeter、LoadRunner等。
企鹅号小编
2018/01/09
1.4K0
干货!超过500行的Mysql学习笔记
mysql基本操作
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
胡齐
2019/09/23
2.2K0
mysql基本操作
MySQL 常用命令一览(万字好文)
下载链接: 链接:https://pan.xunlei.com/s/VMNHMWaZ-bLa5HltrBnjRPdVA1 提取码:v8rh
Gorit
2021/12/09
7660
MySQL 常用命令一览(万字好文)
MySQL DML 操作
  DML(Data Manipulation Language)数据操作语言,以 INSERT、UPDATE、DELETE 三种指令为核心,分别代表插入、更新与删除,DML 和 DQL 合称 CRUD(create、read、update、delete) 增查改删。
Demo_Null
2020/09/28
1.1K0
MySQL DML 操作
听说Mysql你很豪横?-------------管理MySQL数据库基本操作命令
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,后来目前属于Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
不吃小白菜
2020/09/03
1.1K0
相关推荐
MySQL:DDL 数据定义语句盘点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档