用 C++ 統計可由另一個給定字串構造的字串的出現次數
我們得到兩個輸入字串 str_1 和 str_2。目標是找到可以使用 str_1 中的字母構造的與 str_2 相同的字串的計數,其中每個字元只使用一次。
注意 - 兩個字串中的所有字母都使用相同的大小寫。
讓我們透過例子來理解。
輸入 - str_1 = "abcaaaabca",str_2 = "bca";
輸出 - 可由另一個給定字串構造的字串的出現次數為:2
解釋 - str_a 中的子串 bca -
str_1[1-3]=”bca” and str[7-9]=”bca”
輸入 - str_1 = "about",str_2 = "cout";
輸出 - 可由另一個給定字串構造的字串的出現次數為 - 0
解釋 - str_a 中不存在子串 cout。
下面程式中使用的方案如下
我們首先計算 str_1 中所有字母的頻率,並將其儲存在陣列 arr_1[26] 中,並將 str_2 中所有字母的頻率儲存在陣列 arr_2[26] 中。
獲取兩個字串 str_1 和 str_2。計算長度為 str_1.size() 和 str_2.size()。
函式 count_string(string str_1, int len_str_1, string str_2, int len_str_2) 獲取兩個字串和長度,並返回可由 str_1 構造的 str_2 字串的數量。
將初始計數設定為 INT_MAX。
初始化兩個陣列 arr_1[26] 用於儲存 str_1 中字元的頻率,arr_2[26] 用於儲存 arr_2 中字元的頻率,初始值為 0。
使用 for 迴圈遍歷 str_1 和 str_2,並更新 arr_1 和 arr_2 中的頻率。
現在再次使用 for 迴圈遍歷 arr_2,如果當前頻率 arr_2[i] 不為零,則計算 count(前一個值)和 arr_1[i]/arr_2[i] 的最小值(對於 str_2 的每個字元,只從 str_1 中取每個字母一次)。
最後,count 將具有 str_1 和 str_2 的匹配對應字元的最小值。例如 aaabbbb (a=3,b=4) 和 abb(a=1,b=2) 最小計數將為 1
在所有迴圈結束時返回 count 作為所需結果。
示例
#include <bits/stdc++.h>
using namespace std;
int count_string(string str_1, int length_str_1, string str_2, int length_str_2){
int count = INT_MAX;
int arr_1[26] = { 0 };
int arr_2[26] = { 0 };
for (int i = 0; i < length_str_1; i++){
arr_1[str_1[i] - 'a']++;
}
for (int i = 0; i < length_str_2; i++){
arr_2[str_2[i] - 'a']++;
}
int total_alphabets = 26;
for (int i = 0; i < total_alphabets; i++){
if(arr_2[i]){
count = min(count, arr_1[i] / arr_2[i]);
}
}
return count;
}
int main(){
string str_1 = "knowledge", str_2 = "know";
int length_str_1 = str_1.size();
int length_str_2 = str_2.size();
cout<<"Count occurrences of a string that can be constructed from another given string are: "<<count_string(str_1,length_str_1, str_2, length_str_2);
return 0;
}輸出
如果我們執行上面的程式碼,它將生成以下輸出:
Count occurrences of a string that can be constructed from another given string are: 1
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP