在这个问题中,我们需要检查子字符串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