C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の代替母音と子音文字列


指定された文字列の場合、母音と子音が交互の位置を占めるように、指定された文字列の文字を再配置します。文字列を正しく並べ替えられない場合は、「そのような文字列はありません」と表示してください。相互の母音の順序と、相互の子音の順序を維持する必要があります。

複数の必要な文字列を作成できる場合は、辞書式に小さく表示します。

Input : Tutorial
Output : Tutorila
Input : onse
Output : nose

「鼻」と「1つ」の2つの可能な結果が存在します。 「鼻」は辞書式順序で小さいため、表示します。

  • 指定された文字列の母音と子音の数がカウントされます。

  • この場合、カウントの差が複数ある場合は、「不可能」を返します。

  • この場合、子音より母音が多い場合は、最初に最初の母音を表示し、残りの文字列に対して繰り返します。

  • この場合、母音よりも子音が多い場合は、最初の子音を最初に表示し、残りの文字列に対して繰り返します。

  • この場合、カウントが同じであれば、最初の母音と最初の子音を比較し、小さい方を最初に表示します。

// C++ application of alternate vowel and consonant string
#include <bits/stdc++.h>
using namespace std;
// 'ch1' is treated as vowel or not
bool isVowel(char ch1){
   if (ch1 == 'a' || ch1 == 'e' || ch1 == 'i' ||
   ch1 == 'o' || ch1 =='u')
   return true;
   return false;
}
// build alternate vowel and consonant string
// str1[0...l2-1] and str2[start...l3-1]
string createAltStr(string str1, string str2,
int start1, int l1){
   string finalStr1 = "";
   // first adding character of vowel/consonant
   // then adding character of consonant/vowel
   for (int i=0, j=start1; j<l1; i++, j++)
   finalStr1 = (finalStr1 + str1.at(i)) + str2.at(j);
   return finalStr1;
}
// function to locate or find the needed alternate vowel and consonant string
string findAltStr(string str3){
   int nv1 = 0, nc1 = 0;
   string vstr1 = "", cstr1 = "";
   int l1 = str3.size();
   for (int i=0; i<l1; i++){
      char ch1 = str3.at(i);
      // count vowels and updaye vowel string
      if (isVowel(ch1)){
      nv1++;
      vstr1 = vstr1 + ch1;
   }
   // counting consonants and updating consonant string
   else{
         nc1++;
         cstr1 = cstr1 + ch1;
      }
   }
   // no such string can be built
   if (abs(nv1-nc1) >= 2)
   return "no such string";
   // delete first character of vowel string
   // then built alternate string with
   // cstr1[0...nc1-1] and vstr1[1...nv1-1]
   if (nv1 > nc1)
   return (vstr1.at(0) + createAltStr(cstr1, vstr1, 1, nv1));
   // delete first character of consonant string
   // then built alternate string with
   // vstr1[0...nv1-1] and cstr1[1...nc1-1]
   if (nc1 > nv1)
   return (cstr1.at(0) + createAltStr(vstr1, cstr1, 1, nc1));
   // if both vowel and consonant
   // strings are of equal length
   // start building string with consonant
   if (cstr1.at(0) < vstr1.at(0))
   return createAltStr(cstr1, vstr1, 0, nv1);
   // start building string with vowel
   return createAltStr(vstr1, cstr1, 0, nc1);
}
 // Driver program to test above
int main(){
   string str3 = "Tutorial";
   cout<< findAltStr(str3);
   return 0;
}

出力

Tutorila

時間計算量&マイナスO(n)、ここで「n」は文字列の長さとして扱われます


  1. CおよびC++の文字列リテラルのタイプは何ですか?

    Cでは、文字列リテラルのタイプはchar[]です。 C ++では、通常の文字列リテラルの型はarray of nconstcharです。たとえば、文字列リテラル「Hello」のタイプは「6constcharの配列」です。ただし、配列からポインタへの変換によってconstchar*に変換できます。 配列からポインタへの変換により、配列の最初の要素へのポインタが生成されることに注意してください。

  2. C++文字列定数と文字定数の違い

    C ++では、一重引用符で囲まれた文字は文字リテラルです。文字型です。たとえば、「a」は、ASCIIベースのシステムでは値97のchar型です。 二重引用符で囲まれた1文字または文字列は、文字列リテラルを表します。これはconstchar[]型であり、文字列の長さ+1のサイズの配列を参照します。その余分な文字は文字列の終わりを示すためにあります。 文字列リテラルは、「abcdefg」のように任意の長さにすることができます。文字リテラルには、ほとんどの場合、1文字だけが含まれます。これらが印刷されるとき、文字列リテラルは、文字列で最初の\0またはNULL文字が検出されるまで印刷されます。