计算C ++中首尾相同的子字符串

给我们一个字符串str。目的是计算str中具有相同起始字符和结束字符的子字符串的数量。例如,如果输入为“ baca”,则子字符串将为“ b”,“ a”,“ c”,“ a”,“ aca”。总计5。

让我们通过示例来理解。

输入-str =“ abaefgf”

输出−具有相同的首尾字符的子字符串计数为:9

说明-子字符串将是

“a”, “b”, “a”, “e” ,”f”, “g”, “f”, “aba”, “fgf”. Total 9.

输入-str =“ abcdef”

输出−具有相同的首尾字符的子字符串计数为:6

说明-子字符串将是-

“a” , “b” , “c”, “d”, “e” ,”f”. Total 6

以下程序中使用的方法如下

解决给定问题的方法可以有多种,即幼稚方法和有效方法。因此,让我们首先来看一下幼稚的方法。我们将把各种长度的子字符串传递给一个函数check()。如果该子字符串以相同字符开始和结束,则增加计数。

  • 取字符串str。计算长度为str.size()。

  • 函数check(string str)接受子字符串str,并检查它的第一个字符和最后一个字符是否相同。(str [0] == str [length-1])。如果为true,则返回1。

  • 函数check_Start_End(string str,int length)以str及其长度作为输入,并返回以相同字符开头和结尾的str子字符串的计数。

  • 将初始计数设为0。

  • 使用两个for循环遍历str。从i = 0到i <length,内部j = 1到j = length-1。

  • 我们将使用所有长度的substr(i,j)获得所有子字符串。将每个子字符串传递给check()。如果返回1,则增加计数。

  • 在两个for循环的末尾,count都将包含许多str的子字符串,它们的起始字符和结束字符相同。

  • 返回计数作为期望的结果。

高效的方法

如我们所见,答案取决于原始字符串中每个字符的频率。

例如,在“ bacba”中,“ b”的频率为2,包括“ b”的子字符串为“ b”,“ bacb”和“ b”。

2 + 1C2 = 3 我们将首先检查每个字符的频率,并添加(char + 1的频率) C 2

  • 取字符串str。计算长度为str.size()。

  • 函数check_Start_End(string str,int length)以str及其长度作为输入,并返回以相同字符开头和结尾的str子字符串的计数。

  • 初始计数为0。

  • 取一个数组arr [26]来存储每个字符的频率。

  • 遍历字符串并存储频率arr [str [i] ='a'] ++++。

  • 遍历频率数组arr [26],并为每个频率arr [i]添加arr [i] *(arr [i] +1)/ 2。要数。

  • 最后返回结果。

示例(普通方法)

#include <bits/stdc++.h>
using namespace std;
int check(string str){
   int length = str.length();
   if(str[0] == str[length-1]){
      return 1;
   }
}
int check_Start_End(string str, int length){
   int count = 0;
   for (int i = 0; i < length; i++){
      for (int j = 1; j <= length-i; j++){
         if (check(str.substr(i, j))){
            count++;
         }
      }
   }
   return count;
}
int main(){
   string str = "bcbdedfef";
   int length = str.length();
   cout<<"Count of substrings with same first and last characters are: "<<check_Start_End(str, length);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Count of substrings with same first and last characters are: 13

示例(有效方法)

#include <bits/stdc++.h>
using namespace std;
#define maximum 26
int check_Start_End(string str, int length){
   int count = 0;
   int arr[maximum] = {0};
   for(int i=0; i<length; i++){
      arr[str[i] - 'a']++;
   }
   for (int i=0; i<maximum; i++){
      count = count + (arr[i]*(arr[i]+1)/2);
   }
   return count;
}
int main(){
   string str = "bcbdedfef";
   int length = str.length();
   cout<<"Count of substrings with same first and last characters are: "<<check_Start_End(str,
length);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

Count of substrings with same first and last characters are: 13
猜你喜欢