[文字列処理アルゴリズム] 最長連続文字とその出現回数のアルゴリズム設計とCコード実装

[文字列処理アルゴリズム] 最長連続文字とその出現回数のアルゴリズム設計とCコード実装

1. 要件の説明

文字列を入力し、文字列内で連続する最長の文字と、その文字が連続して出現する回数を検索するプログラムを作成します。

たとえば、「123444445」では、連続する最長の文字は 4 で、連続出現回数は 5 です。「abcddef」では、連続する最長の文字は d で、連続出現回数は 2 です。「ab」では、連続する最長の文字は a で、連続出現回数は 1 です。

2. アルゴリズム設計

文字列内の各文字を 1 つずつ比較して、最も長く連続する文字と、その文字が連続して出現する回数を取得できます。プログラムの全体的な流れを図 1 に示します。

図1 プログラムの全体的なプロセス

3. 特別なプロセスに関する考慮事項

プログラムを作成する過程では、次のような入力文字列の長さと形式を考慮する必要があります。

1. 入力文字列にスペースが含まれている場合、スペースの前の文字列のみを処理します。

2. 入力文字列には数字、文字、一部の特殊文字を含めることができますが、中国語の文字を含めることはできません。

4. プログラムコード

  1. /******************************************************************************************
  2. * 著作権 (C) 2016、Zhou Zhaoxiong。
  3. *
  4. * ファイル名: LongestContinChars.c
  5. * ファイルID: なし
  6. * 概要: 文字列内の最長連続文字とその数を見つける
  7. * その他の指示: たとえば、「aabbbc」で最も長く続く文字は b で、その数字は 3 です。
  8. * 現在のバージョン: V1.0
  9. * 著者: 周昭雄
  10. * 完成日: 20160316
  11. *
  12. ******************************************************************************/
  13. #include < stdio.h >  
  14.  
  15. // データ型を再定義する
  16. typedef signed char INT8;
  17. 型定義 int INT32;
  18. typedef 符号なし int UINT32;
  19.  
  20. // 関数宣言
  21. void GetLongestContinChars(INT8 *pszInputStr);
  22.  
  23.  
  24. /******************************************************************************************
  25. * 機能説明: 主な機能
  26. * 入力パラメータ: なし
  27. * 出力パラメータ: なし
  28. * 戻り値: 0 - 実行成功 その他 - 実行失敗
  29. * その他の指示: なし
  30. * 変更日 バージョン番号 修正者 変更内容
  31. * ---------------------------------------------------------------------
  32. * 20160316 V1.0 作成者: Zhou Zhaoxiong
  33. ******************************************************************************/
  34. INT32 メイン()
  35. {
  36. INT8 szInputStr[100] = {0};
  37. UINT32 iPosFlag = 0 ;
  38.      
  39. printf("文字列を入力してください: \n");
  40. scanf("%s", szInputStr);
  41. printf(" InputStr =%s\n", szInputStr);
  42.  
  43. // まず中国語の文字があるかどうかを確認します
  44. ( iPosFlag = 0 ; iPosFlag <   strlen (szInputStr); iPosFlag++)
  45. {
  46. if (szInputStr[iPosFlag] <   0 ) // 0未満は中国語の文字が含まれていることを意味します
  47. {
  48. printf("%s には中国語の文字が含まれています。確認してください!\n", szInputStr);
  49. -1 を返します。
  50. }
  51. }
  52.  
  53. // 関数を再度呼び出して、最長連続文字とその番号を取得します
  54. GetLongestContinChars(szInputStr);
  55.  
  56. 0を返します。
  57. }
  58.  
  59.  
  60. /******************************************************************************************
  61. * 関数の説明: 最も連続して出現する文字とその連続出現回数を取得します
  62. * 入力パラメータ: pszInputStr-入力文字列
  63. * 出力パラメータ: なし
  64. * 戻り値: なし
  65. * その他の指示: なし
  66. * 変更日 バージョン番号 修正者 変更内容
  67. * ---------------------------------------------------------------------
  68. * 20160316 V1.0 作成者: Zhou Zhaoxiong
  69. ******************************************************************************/
  70. void GetLongestContinChars(INT8 *pszInputStr)
  71. {
  72. INT8 cCompareChar = '\0' ;
  73. INT8 cLongestContinChar = '\0' ;
  74. UINT32 iMaxLen = 1 ;
  75. UINT32 iCharCount = 1 ;
  76. UINT32 iPosFlag = 0 ;
  77.      
  78. pszInputStr == NULL の場合
  79. {
  80. 戻る;
  81. }
  82.  
  83. cCompareChar = pszInputStr [0]; // 最初の文字から比較を開始する
  84. cLongestContinChar = pszInputStr [0];
  85.  
  86. ( iPosFlag = 1 ; iPosFlag <   strlen (pszInputStr); iPosFlag++)
  87. {
  88. if (pszInputStr[iPosFlag] == cCompareChar)
  89. {
  90. iCharCount++; // 同じ文字数に1を加算する
  91. }
  92. それ以外
  93. {
  94. iCharCount = 1 ; // 文字が異なる場合はカウントは1になります
  95. cCompareChar = pszInputStr [iPosFlag]; // 新しい文字を再比較する
  96. }
  97.          
  98. if (iCharCount > iMaxLen) // 最も連続して出現する文字とその出現回数を取得します
  99. {
  100. iMaxLen = iCharCount ;
  101. cLongestContinChar = pszInputStr [iPosFlag];
  102. }
  103. }
  104.   
  105. printf("最も連続して出現する文字は: %c\n連続出現回数は: %d\n", cLongestContinChar, iMaxLen);
  106. }

5. プログラムのテスト

作成したプログラム「LongestContinChars.c」を Linux マシンにアップロードし、「gcc -g -oLongestContinChars LongestContinChars.c」コマンドを使用してプログラムをコンパイルし、「LongestContinChars」ファイルを生成します。以下はプログラムの詳細なテストです。

1. 入力文字列が「ababbba」の場合、プログラムは次のように実行されます。

  1. 文字列を入力してください:
  2. アババ
  3. 入力文字列= ababbba  
  4. 連続して最も多く出現する文字は、bです。
  5. 連続出現回数は3です

2. 入力文字列が「123321」の場合、プログラムは次のように実行されます。

  1. 文字列を入力してください:
  2. 123321
  3. 入力文字列= 123321  
  4. 最も連続して出現する文字は3です。
  5. 連続出現回数は2です

3. 入力文字列が「!@##$%」の場合、プログラムは次のように実行されます。

  1. 文字列を入力してください:
  2. !@##$%
  3. 入力文字列=!@##$%
  4. 連続して最も多く出現する文字は # です。
  5. 連続出現回数は2です

4. 入力文字列が「abcdef」の場合、プログラムは次のように実行されます。

  1. 文字列を入力してください:
  2. ABCデフ
  3. 入力文字列= abcdef  
  4. 連続して最も多く出現する文字は次の通りです。
  5. 連続出現回数は1です

5. 入力文字列が「we123」の場合、プログラムは次のように実行されます。

  1. 文字列を入力してください:
  2. 私たち123
  3. 入力文字列= us 123
  4. 123には中国語の文字がありますので、ご確認ください。

6. 需要拡大

この記事の要件と手順に基づいて、要件の次の拡張を検討できます。

1. 大文字と小文字は区別されません。つまり、入力文字列が「AAAaaa」の場合、プログラムは 6 回出現する最長の連続文字 A または a を出力します。

2. 文字列に漢字が出現してはならないという制限はありません。つまり、入力文字列が「窝窝头123」の場合、プログラムは最長の連続文字「窝」を出力し、出現回数は 2 です。

[この記事は51CTOコラムニストの周兆雄氏によるオリジナル記事です。著者のWeChat公開アカウント:周の論理(logiczhou)]

この著者の他の記事を読むにはここをクリックしてください

<<:  【文字列処理アルゴリズム】回文判定のアルゴリズム設計とCコード実装

>>:  特定の文字を削除するためのアルゴリズム設計とCコードの実装

ブログ    
ブログ    

推薦する

光と闇:人工知能と人類の未来

今日、人工知能 (AI) はほぼすべての業界とすべての人に影響を及ぼしています。この驚くべき技術は、...

...

「ユーザーを数える」、なぜTikTokはこんなにも中毒性があるのでしょうか?

かわいい子犬や遊び好きな子猫を見るのが好きな人はいないでしょうか?特に、新型コロナウイルス感染症のパ...

GPT のプログラミング バージョンは 30,000 スターに急上昇し、AutoGPT は危険にさらされています。

執筆者 | 王 瑞平AutoGPT に続いて、GPT ファミリーに新しいメンバーである GPT-En...

「概念のドリフト」問題と闘おう! Google が新しい時間認識フレームワークをリリース: 画像認識精度が 15% 向上

機械学習の分野では、コンセプトドリフトという問題が長い間研究者を悩ませてきました。つまり、データの分...

...

...

...

...

快手テクノロジーのマルチメディアコンテンツ理解部門のLi Yan氏:AI技術は快手製品に統合されています

「AI技術はKuaishou製品ライン全体に浸透しています。AI技術による多次元のエンパワーメントに...

GPT-4 はチューリングテストに合格しませんでした。 60年前、古いAIはChatGPTに勝利しましたが、人間の勝率はわずか63%でした。

長い間、「チューリングテスト」は、コンピュータが「知性」を持っているかどうかを判断するための中心的な...

...

人工知能が本格的に登場し、企業はその挑戦に挑む準備ができている

多くの企業は、短期的には利益が見込めないため、AIパイロットプロジェクトを推進できず、AIプロジェク...

人工知能が物流業界に革命を起こす5つの方法

人工知能は物流業界の変革において重要な役割を果たしていることが証明されています。グローバル化が加速す...

...