C++で母音の順列を数える
数nが1つあるとすると、これらの規則を使用して、長さnの文字列をいくつ形成できるかを数える必要があります。各文字は小文字の母音です。各母音「a」の後には「e」のみを続けることができます。各母音「e」の後には、「a」または「i」のみを続けることができます。各母音「i」の後に別の「i」を続けることはできません。各母音「o」の後には、「i」または「u」のみを続けることができます。各母音「u」の後には「a」のみを続けることができます。答えが大きすぎる可能性があるため、10 ^ 9+7を法とする答えが見つかります。
したがって、入力が2の場合、出力は10になります。これは、可能なすべての文字列が「ae」、「ea」、「ei」、「ia」、「ie」、「io」、「iu」であるためです。 、"oi"、 "ou"、"ua"。
これを解決するには、次の手順に従います-
-
m =1 ^ 9 + 7
-
関数add()を定義します。これには、a、b、
が必要です。 -
return((a mod m)+(b mod m))mod m
-
関数mul()を定義します。これにはa、b、
が必要です。 -
return((a mod m)*(b mod m))mod m
-
関数solve()を定義します。これにはnが必要です。
-
サイズ:5 x 5:={{0,1,0,0,0}、{1,0,1,0,0}、{1,1,0,1,1}、{の配列Aを定義します0,0,1,0,1}、{1,0,0,0,0}}
-
サイズが5x5の配列結果を定義します。
-
初期化i:=0の場合、i <5の場合、更新(iを1増やします)、実行-
-
初期化j:=0の場合、j <5の場合、更新(jを1増やします)、実行-
-
iがjと同じである場合、result [i、j]:=1
-
それ以外の場合、result [i、j]:=0
-
-
-
(nを1減らします)
-
初期化i:=1の場合、i <=nの場合、更新(iを1増やします)、実行-
-
結果=結果*A
-
-
合計:=0
-
初期化i:=0の場合、i <5の場合、更新(iを1増やします)、実行-
-
初期化j:=0の場合、j <5の場合、更新(jを1増やします)、実行-
-
sum:=add(result [i、j]、sum)
-
-
-
合計を返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli m = 1e9+7; lli add(lli a, lli b){ return ((a%m) + (b%m))%m; } lli mul(lli a, lli b){ return ((a%m) * (b%m))%m; } class Solution { public: void multiply(lli A[5][5], lli B[5][5]){ lli C[5][5]; for(lli i =0;i<5;i++){ for(lli j=0;j<5;j++){ lli temp =0; for(lli k =0;k<5;k++){ temp = add(temp,mul(A[i][k],B[k][j])); } C[i][j] = temp; } } for(lli i =0;i<5;i++){ for(lli j =0;j<5;j++){ A[i][j] = C[i][j]; } } } lli solve(lli n){ lli A[5][5] = { { 0, 1, 0, 0, 0 }, { 1, 0, 1, 0, 0 }, { 1, 1, 0, 1, 1 }, { 0, 0, 1, 0, 1 }, { 1, 0, 0, 0, 0 } }; lli result[5][5]; for (lli i = 0; i < 5; i++) { for (lli j = 0; j < 5; j++) { if (i == j) result[i][j] = 1; else result[i][j] = 0; } } n--; for (int i = 1; i <= n; i++) multiply(result, A); lli sum = 0; for (lli i = 0; i < 5; i++) { for (lli j = 0; j < 5; j++) { sum = add(result[i][j], sum); } } return sum; } int countVowelPermutation(int n) { return solve(n); } }; main(){ Solution ob; cout << (ob.countVowelPermutation(2)); }
入力
2
出力
10
-
ポインタを使用して文字列内の母音をカウントするC++プログラム?
文字列から母音を取得するには、文字列の各文字を反復処理する必要があります。ここでは、ポインタを使用して文字列内を移動する必要があります。このためには、Cスタイルの文字列が必要です。文字列がstrで示されている場合、*strは最初の文字を保持します。次に、strを増やすと、*strは次の文字を指します。文字が[a、e、i、o、u]または[A、E、I、O、U]にある場合、それは母音です。カウントを増やします アルゴリズム countVowels(str) begin count := 0 for each character ch in str
-
C++での辞書式順序の次の順列
ここでは、C++で文字列の辞書式順序で次の順列を生成する方法を説明します。辞書式順序の次の順列は、基本的にはより大きな順列です。たとえば、「ACB」の次は「BAC」になります。 「BBB」や「DCBA」など、辞書式順序で次の順列が存在しない場合もあります。 C ++では、next_permutation()というライブラリ関数を使用してこれを行うことができます。これは、アルゴリズムヘッダーファイルにあります。 例 #include <iostream> #include <algorithm> using namespace std; main() {