cstring判断包含字符串_作为java程序员要知道的大厂常见的算法面试题:字符串的包含...

1.2 字符串的包含

题目描述

给定一长字符串a和一短字符串b。请问,如何最快地判断出短字符串b中的所有字符是否都在长字符串a中?请编写函数bool StringContain(string &a, string &b)实现此功能。

为简单起见,假设输入的字符串只包含大写英文字母。下面举几个例子。

  • 如果字符串a是"ABCD",字符串b是"BAD",答案是true,因为字符串b中的字母都在字符串a中,或者说ba的真子集。
  • 如果字符串a是"ABCD",字符串b是"BCE",答案是false,因为字符串b中的字母E不在字符串a中。
  • 如果字符串a是"ABCD",字符串b是"AA",答案是true,因为字符串b中的字母A包含在字符串a中。

分析与解法

此题初看似乎很简单,但要高效地实现并不轻松。而且,如果面试官步步紧逼,一个一个否决你想到的方法,要求你给出更快、更好的方案,恐怕就要费不少脑筋了。

解法一:蛮力轮询

82f1df1d312b64107a79a967475db21d.png

判断短字符串b中的字符是否都在长字符串a中,最直观也是最简单的思路则是:轮询短字符串b中的每一个字符,逐个与长字符串a中的每个字符进行比较,看是否都在字符串a中。

参考代码如下:

bool StringContain(string &a, string &b)
{for (int i = 0; i < b.length(); ++i){int j;for (j = 0; (j < a.length()) && (a[j] != b[i]); ++j);if (j >= a.length()){return false;}}return true;
}

如果n是长字符串a的长度,m是短字符串b的长度,那么此算法需要O(nm)次比较。显然,如果nm很大,时间开销太大,需要寻找更好的办法。

解法二:排序后轮询

329bf9859e690474677e71a31a22b6ef.png

如果允许排序,可以考虑先排序后轮询。例如,可先对这两个字符串中的字母进行排序,然后再对两个字符串依次轮询。

常规情况下,两个字符串的排序需要O(mlogm)+O(nlogn)次操作,之后的线性扫描需要O(m+n)次操作。关于排序方法,可以采用最常用的快速排序。

参考代码如下:

bool StringContain(string &a, string &b)
{sort(a.begin(), a.end());sort(b.begin(), b.end());for (int pa = 0, pb = 0; pb < b.length();){while ((pa < a.length()) && (a[pa] < b[pb])){++pa;}if ((pa >= a.length()) || (a[pa] > b[pb])){return false;}++pb;}return true;
}

解法三:素数相乘

有没有比排序后轮询更好的方法呢?

首先,让长字符串a中的每个字母与一个素数对应,如A对应2,B对应3,C对应5,……,依次类推。再遍历长字符串a,把a中的每个字母对应的素数相乘,得到一个整数。然后,让短字符串b中的字母也对应相应的素数,再用b中的每个字母对应的素数除上面得到的整数。如果结果有余数,说明结果为false,当即退出程序;如果整个过程中没有余数,则说明短字符串b是长字符串a的子集。

具体思路总结如下。

(1)按照从小到大的顺序,用26个素数分别代替长字符串a中的所有字母。

(2)遍历长字符串a,求得a中的所有字母对应的素数的乘积。

(3)遍历短字符串b,判断上一步得到的乘积能否被b中的字母对应的素数整除。

(4)输出结果。

上述算法的时间复杂度为O(m+n)。当然,最好情况下的时间复杂度为O(n),即在遍历短字符串b的第一个字母,与长字符串a中所有字符所对应的素数的乘积相除时,当即出现余数,便直接退出程序,返回false。

bool StringContain(string &a, string &b)
{const int p[26] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101 };int f = 1;for (int i = 0; i < a.length(); ++i){int x = p[a[i] - 'A'];if (f % x){f *= x;}}for (int i = 0; i < b.length(); ++i){int x = p[b[i] - 'A'];if (f % x){return false;}}return true;
}

这种素数相乘的方法看似可行,实则不可行,因为素数相乘的结果会很大,从而导致整数溢出(前16个字母对应的素数相乘便会超出long long类型所能表示的最大整数范围)。

c2417b37f180a203768c27dcab987c6e.png

解法四:位运算法

如果面试官继续追问,到底有没有更好的办法呢?或许你绞尽脑汁能想到计数排序。但除了计数排序还有别的办法吗?

事实上,可以先把长字符串a中的所有字符都放入一个散列表(hash table)中,然后轮询短字符串b,看b中的每个字符是否都在散列表里,如果都在,说明长字符串a包含短字符串b;否则,说明不包含。

再进一步,可以用位运算(26位整数表示)为长字符串a计算出一个“签名”,再逐一将短字符串b中的字符放到a中进行查找。

参考代码如下:

bool StringContain(string &a, string &b)
{int hash = 0;for (int i = 0; i < a.length(); ++i){hash |= (1 << (a[i] - 'A'));}for (int i = 0; i < b.length(); ++i){if ((hash & (1 << (b[i] - 'A'))) == 0){return false;}}return true;
}

这个位运算方法的实质是用一个整数代替了散列表,它的空间复杂度为O(1),时间复杂度为O(n+m)。至此,算是比较完美地解决了这个字符串包含的问题。

cb6680916371c89b65ed64d49a4591b2.png

但是,这样真的完美了吗?请读者继续思考。

举一反三

变位词

如果两个字符串中的字符一样,出现次数也一样,只是出现的顺序不一样,则认为这两个字符串是兄弟字符串。例如,"bad"和"adb"即为兄弟字符串。现提供一个字符串,请问如何在字典中迅速找到它的兄弟字符串?

END

资料分享:

工作一到五年的程序员朋友面对目前的技术无从下手,感到很迷茫,高清思维导图及相关视频资料获取方式关注+转发+私信【架构】里面有阿里Java高级大牛直播讲解知识点,分享知识,课程内容都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

精讲直播课:

644043429690f926e7494c2a8aedd9bc.png

全面知识点分析:

a52098730dae81cb7f58e7fdad0434bf.png

d447cc5e750d638c03057630d2b027b0.png

77447014595511e83d994acf4cb147ae.png

42007bc70fc06102d6f1abe35d6027b4.png

丰富资料:

b23b680e989da59ff543cccc508dde22.png

f7479284b06f44bce0000c848eb08fa5.png

941ef50fe682fa4eea24d788b75996ec.png

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

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

相关文章

数字双胞胎技术和物联网如何帮助企业取得成功

来源&#xff1a;物联之家网&#xff08;iothome.com&#xff09;到2023年&#xff0c;全球数字双胞胎市场预计将达到150亿美元&#xff0c;2017年至2023年的复合年增长率&#xff08;CAGR&#xff09;为37&#xff05;。通用电气、IBM和微软等主要公司正在使用数字双胞胎技术来…

武汉凭什么被列为国家超大城市?

2014年11月&#xff0c;国务院发布国发2014第51号文件《关于调整城市规模划分标准的通知》&#xff0c;新标准将城市划分为五类七档&#xff0c;其中规定&#xff1a;城区常住人口1000万人以上的城市为超大城市。 根据该标准&#xff0c;此前北京、上海、天津、重庆、广州、深圳…

sql中排序序号_SQL 和 SPL 的有序运算对比

【摘要】 有序运算是指按照一定的次序对有序集合的成员进行计算。SQL 和 SPL 是大家比较熟悉的程序语言&#xff0c;本文将探讨对于有序运算问题&#xff0c;这两种语言的解决方案和基本原理。如何简便快捷的处理有序运算&#xff0c;这里为你全程解析&#xff0c;并提供 SQL 和…

前方高能!AI 大牛 LeCun 设想下一个新前沿:摈弃深度学习的所有概率技巧,改而掌握不断转变的能量值...

来源&#xff1a;云头条据深度学习界的领军人物Yann LeCun声称&#xff0c;AI的下一个发展阶段可能是摈弃深度学习的所有概率技巧&#xff0c;改而掌握不断转变的能量值。据说工程师&#xff08;以及一些科学家&#xff0c;但以工程师为主&#xff09;早在坐到板凳上搞设计之前…

2019年中国智能制造发展现状及趋势分析报告

来源&#xff1a;前瞻产业研究院未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网…

元学习—Meta Learning的兴起

来源&#xff1a;专知【导读】元学习描述了训练深度神经网络相关的更高级别的元素。在深度学习文献中&#xff0c;“元学习”一词经常表示神经网络架构的自动化设计&#xff0c;经常引用“ AutoML”&#xff0c;“少量学习”或“神经架构搜索”。OpenAI的魔方机器人手的成功源于…

python3 rid1.7.4.2 控制台中文乱码_TL;DR - 有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解...

TL;DR 问题背景&#xff1a; 相信很多用 Sublime Text 来写 Python 2 的同学都遇到过以下这个问题&#xff08;例如这位同学 /t/100435 和这位同学/t/163012 &#xff09;&#xff1a; 在 Sublime Text 里用 Cmd (Ctrl) B 运行代码 print u中文&#xff0c;想要打印出 unicode…

服务器行业深度解析:服务器未来需求知多少

来源&#xff1a;国盛证券一、 全球公有云加速渗透叠加企业上云大趋势来临1. 全球云领军收入增速维持高位&#xff0c;Q2 CAPEX 出现恢复信号全球云计算进入甜蜜点&#xff0c;IaaS 市场主导增长。1&#xff09;2017 年 6 月&#xff0c;Morgan Stanley 认为全球云计算行业进入…

海上瓶子下有东西吗_洗衣液瓶子我从来不扔,瓶身这样剪几刀,解决了很多家庭的大烦恼...

洗衣液瓶子相信家家户户都会有&#xff0c;每次用完的空洗衣液瓶你都扔掉了吗&#xff1f;那就太可惜了&#xff0c;卖废品也卖不了几毛钱&#xff0c;我们可以将废弃的洗衣液瓶简单剪几刀&#xff0c;就能够变废为宝了&#xff0c;能够解决很多家庭生活中的大烦恼。今天就教大…

光耦继电器

光耦继电器(光电继电器) AQW282SX 282SZ 280SX 280SZ 284SX 284SZ 212S 212SX 21 2SZ 文章目录 光耦继电器(光电继电器)前言一、光耦继电器是什么二、光耦继电器的类型三、光电耦合器的应用总结前言 光耦继电器在工业控制、通讯、医疗设备、家电及汽车电子等领域得到广泛应…

媒体查询响应式布局的几个尺寸_媒体查询实现响应式布局

本文主要介绍 media 查询的使用。通过媒体查询&#xff0c;在不同的屏幕尺寸下&#xff0c;可以设置不同的样式。以此&#xff0c;可以完美解决不同屏幕适配的问题。话不多说&#xff0c;先来看看效果&#xff1a;CSSmedia screen and (max-width: 400px) {.btn {background-co…

为什么说,我们可能是宇宙中唯一的智慧生命?

来源&#xff1a;原理我们在宇宙中是孤独的吗&#xff1f;这个问题可归结为&#xff1a;智慧究竟是自然选择的一种可能结果&#xff0c;还是一种不太可能的侥幸&#xff1f;显而易见的是&#xff0c;可能的事件可以经常发生&#xff1b;不太可能的事件很少发生&#xff0c;或者…

jeecg输入中文查询导表为空_学术利器—SCI期刊影响因子查询/中文核心期刊查询系统更新...

吐槽想起自己第一次投中文期刊的情形&#xff1a;当时学校最低要求是发表一篇核心级别的期刊论文&#xff0c;但是哪些期刊是核心期刊呢&#xff1f;完全不知道&#xff01;都怎么投稿呢&#xff1f;也完全不知道&#xff01;只能问问周围的同学或者师兄师姐。他们也就知道谁谁…

Python 学习随笔1

在一个列表中&#xff0c;找出重复数组的位置。 比如在列表name [1, 5, 8, 22, 56, 2, 8, 45, 7, 2, 35, 2, 486, 2, 152, 111, 265, 2, 2]中&#xff0c;找出2的位置。 方法1&#xff1a; 流程为&#xff1a; 找到第一个2的位置&#xff0c;然后在2之后的一个数后面切片&…

震撼!15项世界互联网领先科技成果发布,将对你的生活产生什么影响?

来源&#xff1a;浙江发布10月20日下午&#xff0c;世界互联网领先科技成果发布活动在乌镇互联网国际会展中心举行。今年6月&#xff0c;世界互联网大会组委会向全球互联网企业、科研机构、高等院校以及个人征集全球互联网领域的领先科技成果&#xff0c;收到了来自中国、美国、…

java执行查询postgresql得到中文乱码_Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(上篇)...

关于作者姚延栋&#xff0c;山东大学本科&#xff0c;中科院软件所研究生。PostgreSQL中文社区委员&#xff0c;致力于Greenplum/PostgreSQL开源数据库产品、社区和生态的发展。一、数据库内核揭秘Greenplum 是最成熟的开源分布式分析型数据库(今年6月份预计发布的 Greenplum 6…

关于授予81项成果2019年度“吴文俊人工智能科学技术奖”的决定

来源&#xff1a;人工智能人物为加快实施国家创新驱动发展战略&#xff0c;深入贯彻《新一代人工智能发展规划》&#xff0c;更好地推进科教兴国、人才强国的政策落实&#xff0c;弘扬“尊重劳动、尊重知识、尊重人才、尊重创造”的良好风尚&#xff0c;通过推选优秀的智能科学…

mysql索引 和 es索引_MySQL索引 VS ElasticSearch索引

今天MySQL数据库栏目介绍MySQL索引与ElasticSearch索引的对比。前言这段时间在维护产品的搜索功能&#xff0c;每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的。这甚至比在我本地使用 MySQL 通过主键的查询速度还快。为此我搜索了相关资料&#x…

开启httponly之后登陆失败_二次元约会模拟《少女都市》正式版登陆Steam 橘势大好...

《少女都市(Shoujo City)》于2018年1月在Steam开启了抢先测试&#xff0c;昨天发布了1.0正式版。这是一款专注于二次元和御宅文化的百合向约会模拟游戏&#xff0c;目前Steam好评率94%&#xff0c;自带简体中文。《少女城市》结合了美少女视觉小说与沙盒式的城市探索冒险&#…

科技/IT:2019 年 Q3 表现最佳和最差的企业

来源&#xff1a;云头条在2019年上半年经历稳步上涨之后&#xff0c;由于全球经济的不确定性和美中贸易紧张局势&#xff0c;2019年第三季度的股市如同过山车。道琼斯指数第三季度&#xff08;截至9月30日&#xff09;以26916.83点收盘&#xff0c;比2019年6月28日收盘价上涨1.…