给定字符串在数组[l, r]范围内出现的次数


简介

在本教程中,我们将使用C++实现示例,以查找输入字符串在一个范围为[l,r]的数组中出现的次数。为了解决此任务,字符串数组中仅使用小写字母。不同的字符串存储在字符串数组中,并遍历以检查特定字符串是否存在。这是针对给定的L和R范围。L和R是数组的起始和结束索引值,用于在输入字符串数组中搜索该范围内的字符串。查找位于输入数组的L和R之间的字符串。

演示1

str_arr[] = {“abc”, “def”, “ghi”} 
str = “abc”
L = 1, R = 2

输出

0

在上面的演示中,L和R的值分别为1和2。我们检查字符串“abc”是否在str_arr[1, 2]范围内存在于str_arr中。从索引值为1的起始值迭代str_array[],并搜索字符串“abc”,直到索引值为2。我们发现“abc”在[1, 2]之间不存在,因为它存在于索引值为0的位置。因此,输出为0。

演示2

str_arr = {“abc”, “ghi”, “cde”} 
str = “cde”
L = 1, R = 3

输出

1

在上面的演示中,我们检查字符串“cde”是否在str_arr[1, 3]范围内存在于str_arr中。迭代str_arr以检查其所有元素的给定范围。“cde”存在于str_arr[1, 2]中。因此,输出为1。

示例中使用的C++库函数

语法

sizeof() : 它是C++中的一个关键字,用于确定运算符、数据类型和变量的大小。它在编译时估算大小。

sizeof(data type);

unordered_map() : 它是C++标准库中的一个容器类,定义在头文件中。它以无序的方式存储元素,并以键值对的形式存储。键值对中的每个键都是唯一的,并具有其关联的值。

unordered_map<data_type> nameofunordered_map;

unordered_map::find() : 它是unordered_map类的成员函数。它在unordered_map键值对中搜索特定键。

unordered_map.find(key); 

unordered_map::end() : 它是unordered_map类的成员函数,定义在``头文件中。它返回指向unordered_map最后一个元素之后位置的迭代器。

unordered_map.end(value);

vector() : 它是C++中大小无界的数组,为其元素提供连续的内存位置。它定义在``头文件中。

vector <data_type>vector_name;

upper_bound() : 它指的是存储元素的下一个位置(或迭代器),该位置大于指定值。

upper_bound(value);

begin() : 它返回存储在向量数组中的元素的第一个位置。它是C++库中的预定义函数。此函数不接受任何参数。

vector_name.begin(); 

make_pair() : 它定义在标准C++模板库中。它用于使用其第一个和第二个参数创建值对。参数值可以是不同的数据类型。

make_pair(value1, value2);

算法

  • 初始化一个字符串数组以存储不同的字符串值。

  • 定义一个字符串str,在字符串数组中进行检查。

  • 定义L和R的值。

  • 迭代字符串数组的每个元素以与str进行比较。

  • 取一个计数器变量并将其初始化为0。

  • 如果str与数组的元素匹配,则增加其值。

  • 返回计数器变量并打印它。

示例1

我们使用C++编程概念及其库函数实现其中一个演示。我们使用一种简单的方法,定义一个字符串数组“str_arr{}”。对于给定的范围内的输入字符串str,比较str_arr{}的每个元素。使用计数器变量来计算在str_arr{}中给定范围内输入字符串的出现次数。

#include <bits/stdc++.h>
using namespace std;
 
// User-defined function to count the number of occurrence of a given string
int totalAppearence(string str_arr[], int a, string s, int L, int R){
      //counter variable
      int cnt=0;
   
      //Iterating for the given values of L and R
    for (int x = L-1; x < R; x++){
          //condition for matches string
          if(str_arr[x]==s)cnt++;
    }
 
    return cnt;
}
 
// Program Controller
int main(){
    string str_arr[] = { "abc", "def", "abc" };
    int a = sizeof(str_arr) / sizeof(string);
    int L = 1;
    int R = 2;
    string s = "abc";
 
    cout << "Number of times input string appear in the array is:" << totalAppearence(str_arr, a, s, L, R);
    return 0;
}

输出

Number of times input string appear in the array is: 1

示例2

为了实现上述演示之一,我们使用unordered_map来存储字符串数组的值。unordered_map索引用于在定义的范围内将输入字符串与数组元素进行比较。

由于unordered_map具有映射值和键值对,因此它有助于快速搜索。

#include <bits/stdc++.h>
using namespace std;
 
// User-defined function to count the occurrence of input string
int totalAppearence(string str_arr[], int a, string s, int L, int R)
{
    // initialized unordered_map
    unordered_map<string, vector<int> > N;
    for (int x = 0; x < a; x++) 
    {
        string t = str_arr[x];
        auto i = N.find(t);
 
        if (i == N.end()) 
        {
            vector<int> B;
            B.push_back(x + 1);
            N.insert(make_pair(t, B));
        }
        else 
        {
            i->second.push_back(x + 1);
        }
    }
 
    auto i = N.find(s);
 
    // When string is not in array
    if (i == N.end())
        return 0;
 
    //when string is found in array
    vector<int> B = i->second;
    int m = upper_bound(B.begin(), B.end(), R) - B.begin();
    int n = upper_bound(B.begin(), B.end(), L - 1) - B.begin();
 
    return (m - n);
}
 
// program controller
int main()
{
    string str_arr[] = { "abc", "dfe", "cba" };
    int a = sizeof(str_arr) / sizeof(string);
    int L = 1;
    int R = 1;
    string s = "gef";
 
    cout << "Number of times input string appears in the array is : " << totalAppearence(str_arr, a, s, L, R);
 
    return 0;
}

输出

Number of times input string appears in the array is : 0

结论

我们完成了本教程,以查找输入字符串在范围为L和R的字符串数组中出现的次数。演示了该任务,使问题陈述更清晰,便于实现。我们使用不同的C++库函数实现了两个示例。在第一个示例中,我们获取一个字符串数组,并迭代定义范围内的元素,并检查它是否与输入字符串匹配。在第二种方法中,使用unordered_map存储索引。要搜索输入字符串的出现次数,请搜索unordered_map索引并打印结果。

更新于:2023年8月18日

64次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告