突破编程_C++_字符串算法(检查一个字符串是否是某个字符串的排列)

1 算法题 :检查一个字符串是否是某个字符串的排列

1.1 题目含义

检查一个字符串是否是某个字符串的排列,需要判断两个字符串是否由相同的字符组成,且每个字符出现的次数也相同,但是字符的顺序可以不同。简而言之,如果能够通过对一个字符串中的字符进行重新排列,使其与另一个字符串完全相同,那么这两个字符串就是彼此的排列。

1.2 示例

示例 1:
输入:

  • 字符串1:“anagram”
  • 字符串2:“nagaram”

输出:

  • true

解释:

  • 字符串 1 和字符串 2 都由字符’a’、‘n’、‘a’、‘g’、'r’和’m’组成,并且每个字符出现的次数也相同。虽然字符的顺序不同,但它们仍然是彼此的排列。

示例 2:
输入:

  • 字符串1:“listen”
  • 字符串2:“silent”

输出:

  • true

解释:

  • 字符串 1 和字符串 2 都由字符’l’、‘i’、‘s’、‘t’和’e’、'n’组成(注意’n’和’e’的顺序在两个字符串中是不同的),并且每个字符出现的次数也相同。因此,它们是彼此的排列。

示例 3:
输入:

  • 字符串1:“hello”
  • 字符串2:“world”

输出:

  • false

解释:

  • 字符串 1 由字符’h’、‘e’、‘l’、‘l’和’o’组成,而字符串 2 由字符’w’、‘o’、‘r’、‘l’和’d’组成。尽管两个字符串都包含字符’l’和’o’,但它们包含的其他字符和字符的总数不同,因此它们不是彼此的排列。

2 解题思路

解题思路如下:

(1)初始化: 首先,需要两个字符串作为输入,将其称之为 str1 和 str2。

(2)长度检查: 首先检查两个字符串的长度是否相等。如果长度不等,那么它们不可能是彼此的排列,因为排列意味着字符的种类和数量都必须相同。

(3)字符计数: 使用一个数据结构(如数组或哈希表)来统计 str1 中每个字符的出现次数。数组的大小通常是 26(针对小写英文字母)或 52(针对小写和大写英文字母),哈希表则没有这样的限制。

(4)比较字符计数: 接下来,遍历 str2 中的每个字符,并在字符计数数据结构中减少对应字符的计数。如果任何时候某个字符的计数降到 0 以下,或者某个字符在 str2 中不存在但在 str1 中存在(即计数不为 0),那么这两个字符串不是彼此的排列。

(5)检查结果: 如果上述过程没有提前返回 false,那么在遍历完 str2 之后,可以得出结论,两个字符串是彼此的排列,因为它们的字符种类和数量都相同。

(6)返回结果: 根据检查结果,返回 true 或 false。

这个算法的时间复杂度是 O(n),其中 n 是字符串的长度,因为只需要遍历每个字符串一次。空间复杂度取决于使用的数据结构,如果使用固定大小的数组,则空间复杂度为 O(1)(对于固定大小的字母表);如果使用哈希表,则空间复杂度为 O(m),其中 m 是 str1 中不同字符的数量。

3 算法实现代码

3.1 使用哈希表

如下为算法实现代码:

#include <iostream>  
#include <string>  
#include <unordered_map>  class Solution
{
public:bool isPermutation(const std::string& str1, const std::string& str2){if (str1.length() != str2.length()) {return false; // 如果长度不同,则它们不可能是排列  }// 使用哈希表来统计字符出现次数  std::unordered_map<char, int> charCount;// 填充哈希表,统计str1中每个字符的出现次数  for (char c : str1) {charCount[c]++;}// 遍历str2,并在哈希表中减少对应字符的计数  for (char c : str2) {if (charCount[c] == 0) {return false; // 如果字符在str2中存在但在str1中不存在,返回false  }charCount[c]--;}// 检查哈希表中是否还有计数不为0的字符  for (const auto& pair : charCount) {if (pair.second != 0) {return false; // 如果还有计数不为0的字符,则它们不是排列  }}return true; // 所有检查都通过,它们是排列  }
};

上面代码首先检查两个字符串的长度是否相等,如果不等,则它们不可能是排列。接着,使用 std::unordered_map(哈希表)来统计 str1 中每个字符的出现次数。然后,遍历 str2,并在哈希表中相应减少字符的计数。如果在遍历 str2 的过程中发现某个字符的计数已经为 0,或者某个字符在 str1 中存在但在 str2 中不存在,则返回 false。最后,检查哈希表中是否还有任何非零的计数,如果有,则返回 false,否则返回 true,表示两个字符串是排列。

调用上面的算法,并得到输出:

int main() 
{Solution ss;std::string str1, str2;// 测试用例1  str1 = "abc";str2 = "abc";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;// 测试用例2  str1 = "abc";str2 = "cab";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;// 测试用例3  str1 = "";str2 = "";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;// 测试用例4  str1 = "abcdefg";str2 = "abc";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;// 测试用例5  str1 = "abc, 12&def";str2 = "c,12 &abdef";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;// 测试用例6  str1 = "abcabcabc";str2 = "abcabcabc";std::cout << "Is \"" << str1 << "\" a permutation of \"" << str2 << "\"? "<< (ss.isPermutation(str1, str2) ? "Yes" : "No") << std::endl;return 0;
}

上面代码的输出为:

Is "abc" a permutation of "abc"? Yes
Is "abc" a permutation of "cab"? Yes
Is "" a permutation of ""? Yes
Is "abcdefg" a permutation of "abc"? No
Is "abc, 12&def" a permutation of "c,12 &abdef"? Yes
Is "abcabcabc" a permutation of "abcabcabc"? Yes

3.2 使用排序算法

可以使用排序算法来检查两个字符串是否是彼此的排列。如果两个字符串是彼此的排列,那么它们包含相同的字符(不考虑顺序),因此,如果将它们排序,排序后的字符串应该是相同的。

如下为算法实现代码:

#include <iostream>  
#include <string>  
#include <algorithm> // 为了使用sort函数 class Solution
{
public:bool isPermutation(const std::string& str1, const std::string& str2){if (str1.length() != str2.length()) {return false; // 长度不同的字符串不可能是排列  }// 创建两个字符串的副本,以便排序它们而不改变原始字符串  std::string sortedStr1 = str1;std::string sortedStr2 = str2;// 对两个字符串进行排序  std::sort(sortedStr1.begin(), sortedStr1.end());std::sort(sortedStr2.begin(), sortedStr2.end());// 比较排序后的字符串是否相同  return sortedStr1 == sortedStr2;}
};

在这个实现中,首先检查两个字符串的长度是否相等。如果不等,则它们不可能是排列。然后创建两个字符串的副本并对它们进行排序。最后比较排序后的字符串是否相同。如果相同,则原始字符串是彼此的排列。

这个算法的时间复杂度主要由排序算法决定,通常是 O(n log n),其中 n 是字符串的长度。空间复杂度是 O(log n)(对于比较排序算法如快速排序或归并排序)或 O(n)(对于原地排序算法如堆排序)。

4 测试用例

以下是针对上面算法的测试用例,确保覆盖各种情况:

(1)两个长度相同且字符种类和数量都相同的字符串:

  • 字符串1:“abc”
  • 字符串2:“abc”
  • 预期输出:true

(2)两个长度相同但字符顺序不同的字符串:

  • 字符串1:abc
  • 字符串2:cab
  • 预期输出:true

(3)两个空字符串:

  • 字符串1:(空字符串)
  • 字符串2:(空字符串)
  • 预期输出:true

(4)一个长字符串和一个短字符串:

  • 字符串1:abcdefg
  • 字符串2:abc
  • 预期输出:false

(5)包含特殊字符的字符串:

  • 字符串1:abc, 12&def
  • 字符串2:c,12 &abdef
  • 预期输出:true

(6)包含重复字符的字符串:

  • 文本串:abcabcabc
  • 子串:aaabbbccc
  • 预期输出:true

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

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

相关文章

软考58-上午题-【数据库】-分布式数据库

一、四个透明 二、四种性质 三、真题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a;

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台&#xff0c;推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分&#xff0c;面临着转型升级的紧迫需求。随着5G技术的快速发展&#xff0c;智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

力扣76. 最小覆盖子串(滑动窗口)

Problem: 76. 最小覆盖子串 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义两个map集合need和window&#xff08;以字符作为键&#xff0c;对应字符出现的个数作为值&#xff09;&#xff0c;将子串t存入need中&#xff1b; 2.定义左右指针left、right均指向0&#xff…

【AI视野·今日Sound 声学论文速览 第五十期】Fri, 1 Mar 2024

AI视野今日CS.Sound 声学论文速览 Fri, 1 Mar 2024 Totally 9 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Probing the Information Encoded in Neural-based Acoustic Models of Automatic Speech Recognition Systems Authors Quentin Raymondau…

蓝月亮,蓝禾,三七互娱,顺丰,康冠科技,金证科技24春招内推

蓝月亮&#xff0c;蓝禾&#xff0c;三七互娱&#xff0c;顺丰&#xff0c;康冠科技&#xff0c;金证科技24春招内推 ①蓝月亮 【招聘岗位】技术&#xff0c;研发&#xff0c;lT&#xff0c;供应链&#xff0c;市场&#xff0c;职能等 【网申链接】https://sourl.cn/NsVxG6 【内…

Git分布式管理-头歌实验本地版本库

一、本地版本库创建 任务描述 本地Git操作三部曲是“修改-添加-提交”&#xff0c;即先要在本地仓库进行添加、删除或编辑等修改&#xff0c;然后将本地所做的修改添加至暂存区。添加至暂存区的这些本地修改&#xff0c;并未提交到本地仓库&#xff0c;需要执行提交命令才能将暂…

CAN通信篇 - CanTrcv模块配置(二)

文章目录 CanTrcvConfigSetCanTrcvChannelCanTrcvDioChannelAccess 总结 CanTrcv模块配置也比较简单&#xff0c;主要是配置CanTrcv的行为。有一些工程甚至没有包含CanTrcv配置模块(CanTrcv配置代码已通过手写代码方式嵌入工程)。下图所示为CanTrcv模块配置容器。 CanTrcvConfi…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格&#xff0c;但为了保证语音交友系统开发质量&#xff0c;在编码前需要进行代码风格的统一&#xff0c;通过制定一定的规则&#xff0c;约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

Mysql80服务无法启动请输入Net helpMsg3534以获得更多的帮助

起因&情景&#xff1a; 朋友正在操作数据库&#xff0c;然后电脑突然死机&#xff0c;再重启电脑后启动数据库服务报&#xff1a; 然后朋友尝试各种操作都没有办法正常启动&#xff0c; 一、网上解决方案&#xff1a;&#xff08;先别操作&#xff09; 1 删掉&#xff1a…

VueUse 安装使用

VueUse 是一个集成了常用的 Vue Composition API 的函数库&#xff0c;它提供了一系列的 hooks 和工具函数&#xff0c;帮助我们更方便地使用 Vue Composition API。在本文中&#xff0c;我将为你介绍如何安装和使用 VueUse。 安装 首先&#xff0c;你需要打开一个终端窗口&a…

如何系统的学习Python——Python社区分享

Python社区非常庞大而活跃&#xff0c;有许多在线论坛、社交媒体群组和本地编程社区。以下是一些值得参与的Python社区&#xff1a; Python官方社区&#xff1a; 简介&#xff1a; Python官方社区提供了许多资源&#xff0c;包括文档、论坛、博客等&#xff0c;是学习和讨论Pyt…

爬取博客的图片并且将它存储到响应的目录

目录 前言 思想 注意 不多说解释了&#xff0c;贴代码吧 config.json Get_blog_img.py 把之前的写的代码也贴上 Get_blog_id.py 主函数 main.py 运行结果 前言 在上一篇博客中我们介绍了如何爬取博客链接 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读74…

MatteFormer:Transformer-based image matting via prior-tokens

【CVPR2022】MatteFormer: Transformer-Based Image Matting via Prior-Tokens-CSDN博客文章浏览阅读1.2k次。【CVPR2022】 MatteFormer: Transformer-Based Image Matting via Prior-Tokens_matteformerhttps://blog.csdn.net/Thinkobj/article/details/128209388本文核心2点&…

Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机

Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机 背景&#xff1a;每次安装都要到处找资源&#xff0c;现在一篇文章足以 文章目录 Vmware Fusion 13 安装CentOS、Ubuntu、Windows11虚拟机一、Mac中安装CentOS虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟…

引入js,刷新清除缓存

一、这种会让所有的css/js资源重新加载 <meta http-equiv"pragram" content"no-cache"> <meta http-equiv"cache-control" content"no-cache, no-store, must-revalidate">二、加时间戳 每次引入&#xff0c;后面版本号都…

c/c++ | 操作系统 | skynet

这段时间发现一个项目skynet&#xff0c;也不算发现吧&#xff0c;就是花了点时间在这上面 这个项目是一个叫[云凤]的大佬&#xff0c;花了一个月的时间写好的&#xff0c;写的时间好像还是十几年前&#xff1f; 后来这个大佬开了 开了公司&#xff1f; 后来被阿里收购了&#…

GitHub热榜第二的sora同款工具——DUSt3R

目录 Sora - 探索AI视频模型的无限可能 传送门&#xff1a; Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技…

apache-maven-3.6.3-bin.zip下载

apache-maven-3.6.3-bin.zip https://acc15t4bm5.feishu.cn/file/boxcnKovgJ7MjwWQ88otCMU24DQ?fromfrom_copylink

《低代码平台开发实践:基于React》读书心得与实战体验

低代码平台开发实践标题 &#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 一、引…