字符串中以给定字符串开头和结尾的字符串中的不同子字符串

在本教程中,我们将编写一个程序来查找以给定字符串开头和结尾的子字符串的总数。

我们给了一个字符串和两个子字符串。我们需要找到以给定的两个子字符串开始和结束的不同子字符串计数。让我们来看一个例子。

输入

str = "getmesomecoffee"
start = "m"
end = "e"

输出

6

给定字符串中总共有6个不同的子字符串。他们是我,亲切的,亲切的咖啡,亲切的咖啡,亲切的咖啡,麦咖啡。

让我们看看解决问题的步骤。

  • 初始化字符串。

  • 遍历str并找到start和end子字符串索引。将它们存储在单独的数组中。

  • 初始化一个集合以存储不同的子字符串。

  • 遍历str。

    • 检查当前索引是否与我们之前形成的数组的开始字符串匹配。

    • 如果找到起始字符串索引,则搜索结束字符串。

    • 添加所有字符串,直到找到变量的结尾。

    • 当我们找到结束字符串时,增加子字符串计数并将子字符串添加到集合中。

    • 重置子字符串变量。

  • 打印子字符串计数。

示例

让我们看一下代码。

#include <bits/stdc++.h>
using namespace std;
int getSubstringsCount(string str, string start, string end) {
   int substrings_count = 0, str_length = str.size(), start_length = start.size(), end_length = end.size();
   int start_matches_index[str_length] = {0}, end_matches_index[str_length] = {0};
   for (int i = 0; i < str_length; i++) {
      if (str.substr(i, start_length) == start) {
         start_matches_index[i] = 1;
      }
      if (str.substr(i, end_length) == end) {
         end_matches_index[i] = 1;
      }
   }
   set<string> substrings;
   string current_substring = "";
   for (int i = 0; i < str_length; i++) {
      if (start_matches_index[i]) {
         for (int j = i; j < str_length; j++) {
            if (!end_matches_index[j]) {
               current_substring += str[j];
            }
            if (end_matches_index[j]) {
               current_substring += str.substr(j, end_length);
               if (substrings.find(current_substring) == substrings.end()) {
                  substrings_count++;
               }
               substrings.insert(current_substring);
            }
         }
         current_substring = "";
      }
   }
   return substrings_count;
}
int main() {
   string str = "getmesomecoffee";
   string start = "m";
   string end = "e";
   cout << getSubstringsCount(str, start, end) << endl;
   return 0;
}
输出结果

如果执行上述程序,则将得到以下结果。

6

结论