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

2023年 8月 28日 61.1k 0

检查给定句子中,子串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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论