检查给定句子中,子串S2的任何出现后是否出现子串S1

检查给定句子中,子串s2的任何出现后是否出现子串s1

在这个问题中,我们需要检查子字符串S1是否出现在给定字符串S中子字符串S2的任何出现之后。我们可以比较S1和S2在字符串S中的起始索引来解决这个问题。 p>

问题陈述——我们给出了三个子字符串,名为 S、S1 和 S2。字符串 S 始终包含 S1 作为子字符串。我们需要检查给定字符串 S 中子字符串 S1 是否出现在子字符串 S2 出现之后。

示例

输入– S =“abxtutorialspointwelcomepoint”,S1 =“欢迎”,S2 =“点”;

输出 – 是

解释 – 在字符串 S 中,“point”子字符串出现了 2 次。一个在“欢迎”之前,另一个在“欢迎”之后。所以,我们可以说字符串 S1 出现在字符串 S2 的任何出现之后

输入–   S = “abcdefgh”, S1 = “abcd”, S2 = “gh”;

输出 – 否

解释S1位于字符串S的开头。因此,S1不会出现在子字符串S2之后。

输入– S =“abce”,S1 =“bc”,S2 =“xy”;

输出 – 否

说明 – 由于字符串 S2 不存在于字符串 S 中,因此打印 No。

方法 1

在这种方法中,我们将找到 S2 子字符串的所有起始索引并将它们存储在集合中。之后,我们将得到S1的起始索引。我们将 S2 的每个起始索引与 S1 的起始索引进行比较,如果我们发现集合中的任何值小于 S2 的起始索引,则可以说子字符串 S1 出现在子字符串 S2 的任何出现之后。

算法

定义存储子串S2起始索引的集合。

使用 find() 方法查找 S2 子字符串的第一个起始索引。

使用while循环获取子字符串S2的所有起始索引,并使用insert()方法将它们存储到集合中。

遍历设定值。如果任何值小于给定字符串 S 中子字符串 S1 的起始索引,则返回 true。

最后返回 false。

示例

#include #include #include using namespace std;bool isS1AfterS2(string& S, string& S1, string& S2) {   // set to store indices of S2 in S   unordered_set indices;   // Find all occurrences of S2 in S, and store them in set   size_t found = S.find(S2);   while (found != string::npos) {      indices.insert(found);      found = S.find(S2, found + 1);   }   // Compare starting indices of S1 with S2   for (const int& index : indices) {      if (index < S.find(S1)) {          return true;  // S2 appears before S1      }   }   return false;  // S1 appears before or at the same position as S2}int main(){   string S = "abxtutorialspointwelcomepoint";   string S1 = "welcome", S2 = "point";   if(isS1AfterS2(S, S1, S2)) {          cout << "Yes, string S1 appears after string S2.";   } else {       cout << "No, string S1 does not appear after string S2.";   }   return 0;}

输出

Yes, string S1 appears after string S2.

时间复杂度 – O(N*K),因为我们需要找到字符串 S2 的起始索引。

空间复杂度 – O(N),因为我们存储字符串 S2 的起始索引。

方法2

在这种方法中,我们将遍历字符串。如果我们发现 S2 在 S1 出现之前出现,则返回 true,因为字符串 S 始终包含字符串 S1。

算法

定义len、n1和n2变量来存储变量的长度。

开始遍历字符串。

定义‘temp 字符串,并使用从第 i 个索引开始的长度为 n2 的子字符串对其进行初始化。

如果 temp == S2,则返回 true。

从第 i 个索引开始取长度为 n1 的子字符串。如果 temp == s1,则返回 false。

最后返回true。

示例

#include using namespace std;bool isS1AfterS2(string &S, string &S1, string &S2){   // store the length of the strings   int n1 = S1.size(), n2 = S2.size();   // Traverse the string S from left to right   for (int i = 0; i <= S.size() - n2; i++){      // temporary string to store substring      string temp;      // get the substring      temp = S.substr(i, n2);      // if we find the string S2, return true as s1 always present in s.      if (temp == S2){          return true;      }      temp = S.substr(i, n1);      // If we find s1 before s2, return false      if (temp == S1){          return false;      }   }   return true;}int main(){   string S = "abxtutorialspointwelcome";   string S1 = "welcome", S2 = "point";   if(isS1AfterS2(S, S1, S2)) {      cout << "Yes, string S1 appears after string S2.";   } else {       cout << "No, string S1 does not appear after string S2.";   }   return 0;}

输出

Yes, string S1 appears after string S2.

时间复杂度 – O(N*min(n1, n2)),因为我们找到长度为 n1 和 n2 的子字符串。

空间复杂度 – O(min(n1, n2),因为我们存储子字符串。

在第一种方法中,我们使用集合来存储S2的起始索引,这比第二种方法的代码需要更多的空间。第二种方法的代码比第一种方法更具可读性。另外,程序员可以尝试解决检查子串S2是否出现在S1出现之后的问题。

以上就是检查给定句子中,子串S2的任何出现后是否出现子串S1的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1443395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 20:04:03
下一篇 2025年12月17日 20:04:26

相关推荐

  • 怎样让按钮点击后出现“点”的边框

    这次给大家带来怎样让按钮点击后出现“点”的边框,按钮点击后出现“点”的边框的注意事项有哪些,下面就是实战案例,一起来看一下。 // Ainput {  outline: none;}// BInput::-moz-focus-inner {  border: none;}//加了ouline没用,别…

    好文分享 2025年12月21日
    000
  • 检查一个字符串是否表示一个十六进制数

    在计算机科学中,十六进制是一种基于16的数字系统。它使用16个不同的符号,包括十个十进制数字0到9和六个字母A、B、C、D、E和F来表示从0到15的数字。在本文中,我们将讨论如何检查一个字符串是否表示一个十六进制数。 问题陈述 给定一个字符串,任务是检查它是否表示一个有效的十六进制数。 方法 我们可…

    2025年12月17日
    000
  • 检查一个字符串是否可以被分割成三个子字符串,其中一个子字符串是另外两个子字符串的子串

    在这个问题中,我们需要分割给定的字符串,使得第三个子字符串可以是前两个子字符串的子字符串。 让我们想想解决办法。仅当前两个字符串包含第三个字符串的所有字符时,第三个字符串才可以是前两个字符串的子字符串。所以,我们需要在给定的字符串中找到至少一个出现频率大于3的字符,并且我们可以取该单个字符的第三个子…

    2025年12月17日
    000
  • 在C语言中编写一个程序,用于检查给定的年份是否为闰年

    闰年有366天,而普通年有365天,任务是通过程序检查给定的年份是否为闰年。 判断的逻辑可以通过检查年份是否能被400或4整除来实现,但如果不能被这两个数整除,则为普通年。 示例 Input-: year=2000Output-: 2000 is a Leap YearInput-: year=10…

    2025年12月17日
    000
  • 检查每个单词的字符是否可以重新排列以形成等差数列(AP)

    在本文中,我们将讨论如何检查给定字符串中每个单词的字符是否可以重新排列以形成等差数列(AP)。我们还将使用C++实现解决方案,并提供一个示例来说明代码的工作原理。 等差数列(AP) 等差数列(AP)是一组数字的序列,其中每个项都是通过将常数d添加到前一项来获得的。常数d被称为公差。 例如,序列 1,…

    2025年12月17日
    000
  • C程序检查强数

    给定一个数字’n’,我们需要检查给定的数字是否是强数。 强数是指其所有数字的阶乘之和等于数字’n’。阶乘是指将小于该数字的所有数字(包括该数字)相乘的结果,用!(感叹号)表示。例如:4!= 4x3x2x1 = 24。 因此,要确定一个数字是否是强数,我…

    2025年12月17日
    000
  • 一个高效的方法来检查第n个斐波那契数是否是10的倍数?

    这里我们将看到一种有效的方法来检查第 n 个斐波那契项是否是 10 的倍数。假设斐波那契项为 {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987}。因此,这里第 15 个斐波那契数(从 0 开始计数)可以被 10 整除。…

    2025年12月17日
    000
  • 在C语言中编写一个程序,用于检查一个字符串是否包含任何特殊字符

    给定一个字符串 str[],任务是检查字符串是否包含任何特殊字符,如果字符串有特殊字符,则打印“字符串不被接受”,否则打印“字符串被接受”。 特殊字符是那些既不是数字也不是字母的字符,即 – !@#$%^&*()+=-][‘;/.,{}|:”?`~ 因此,在C编程语言…

    2025年12月17日
    000
  • 检查是否可能从原点到达给定圆的周长上的任意点

    圆的周长可以定义为圆的外边界。它是圆的周长。圆周围的每个点都遵循某些属性,如下所示 – 点 (x,y) 位于圆内,使得 $mathrm{x^2 + y^2 点 (x,y) 位于圆上,使得 $mathrm{x^2 + y^2 = R^2}$ 点 (x,y) 位于圆外,使得 $mathrm{…

    2025年12月17日
    000
  • 检查给定二进制字符串的得分

    字节序列被称为二进制字符串,它保存着二进制值。二进制分数通常在0到1的范围内表示,其中1保留给完美模型。在给定的二进制字符串中,如果元素被发现为1,则将其计算为分数并增加计数总和。 让我们以一个二进制分数的例子来说明 – 给定的二进制字符串是 1011010。 在上图中,数字1出现在索引…

    2025年12月17日
    000
  • 检查给定字符串是否是回文的C程序?

    回文是一个单词、数字、短语或其他字符序列,它从前往后读和从后往前读是一样的。像madam或racecar这样的单词,或者像10801这样的数字都是回文。 对于给定的字符串,如果将字符串反转后得到的字符串与原字符串相同,则我们可以说该字符串是回文。这意味着要检查一个字符串是否是回文,我们需要找出第一个…

    2025年12月17日
    000
  • C# 数组作为参数传递出现的问题解决

    原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值。 如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很难被检查到,所以我们在设计方法参数的时候,要充分考虑传递引用类型参数或者引用方式传递引用类型参数可能…

    好文分享 2025年12月17日
    000
  • MYSQL 出现Error 1045 access denied 原因与解决方法(1/2)

    MYSQL 出现Error 1045 access denied 原因与解决方法

    数据库 2025年12月2日
    000
  • Python怎么统计字母出现的次数

    这次给大家带来Python怎么统计字母出现的次数,Python统计字母出现次数的注意事项有哪些,下面就是实战案例,一起来看一下。 题目: 统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。 前言: 这道题在实际应用场景中使用比较广泛,比如统计历年来四六级考试中出现的高频词汇,记得李笑来就…

    2025年11月28日
    000
  • 检查Linux上SSH的版本的步骤

    Linux中SSH版本检查步骤 Secure Shell(SSH)是一种网络协议,用于安全地在网络上建立远程连接。在Linux系统中,SSH扮演着非常重要的角色,因为它是管理和维护远程服务器的标准方式。为了确保服务器的安全性,我们需要了解服务器上正在运行的SSH版本。下面将详细介绍在Linux系统中…

    2025年11月27日 运维
    100
  • 如何在Linux系统中检查端口是否被占用

    在Linux系统中检查端口是否被占用是一个常见的操作,可以通过使用一些命令和工具来实现。以下是一些常用的方法和具体的代码示例: 使用netstat命令检查端口占用情况:netstat命令是一个用来显示网络状态信息的工具,可以通过以下命令来检查指定端口是否被占用: netstat -tuln | gr…

    2025年11月25日 运维
    000
  • Linux如何检查防火墙是否启用

    检查firewalld:systemctl status firewalld或firewall-cmd –state,显示running则启用;2. 检查ufw:ufw status,active表示启用;3. 检查iptables:sudo iptables -L,有规则列出说明已配置…

    2025年11月24日 运维
    100
  • Linux SSH版本检查方法详解

    【标题】Linux SSH版本检查方法详解 SSH(Secure Shell)是一种用于远程登录和执行命令的网络协议,常用于Linux系统上。随着技术的不断发展,SSH协议也不断更新升级,而检查SSH版本是保证系统安全的重要一环。本文将详细介绍Linux下检查SSH版本的方法,并附上具体的代码示例。…

    2025年11月19日
    000
  • Oracle存储过程中如何检查表是否存在

    在Oracle%ignore_a_1%中如何检查表是否存在 在Oracle数据库中,对于开发人员来说经常需要编写存储过程来完成一些复杂的业务逻辑。在编写存储过程时,有时需要在程序中判断某张表是否存在,以便根据表是否存在来执行不同的操作。本文将介绍在Oracle存储过程中如何检查表是否存在,并提供具体…

    2025年11月16日
    000
  • SQLSERVER中分发或合并代理中出现ID标识满阈值处理方法

    SQLSERVER中分发或合并代理中出现ID标识满阈值处理方法 sp_adjustpublisheridentityrange , ,   SQLSERVER中分发或合并代理中出现ID标识满阈值处理方法 慧中标AI标书 慧中标AI标书是一款AI智能辅助写标书工具。 120 查看详情 sp_adjus…

    2025年11月9日
    500

发表回复

登录后才能评论
关注微信