[文字列処理アルゴリズム] 最長連続文字とその出現回数のアルゴリズム設計と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コードの実装

ブログ    
ブログ    

推薦する

NeO 360: 屋外シーンのスパースビュー合成のためのニューラルフィールド

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

あなたの仕事はAIに置き換えられるでしょうか?李開復氏は、これらの4種類の仕事について心配する必要はないと述べている。

[[255576]]最近、李開復氏はタイム誌に「人工知能は強力だが、誤解されている。労働者を守るに...

機械学習から学習する機械まで、データ分析アルゴリズムにも優れた管理者が必要だ

[[177274]]写真は、IBM Big Data and Analytics のグローバル研究開...

建物をスマートかつ持続可能なものに変える重要性

[[428632]]温室効果ガス削減目標と規制要件を満たすには、企業は施設をエネルギー効率の高いスマ...

Google Brain エンジニアの講演: TensorFlow とディープラーニング

この記事は、Google Brain エンジニアの Zhou Yuefeng 氏が QCon Sha...

アクセンチュアは、ジェネレーティブAIがビジネスにとって重要な破壊的要因であると強調

アクセンチュアがダボスで開催される世界経済フォーラム年次総会に先立ち発表した「2024 Pulse ...

...

「AI+」が世界を変える!さまざまな分野における 5 つの主要な AI トレンド

人工知能は現代世界で最も注目され、最も議論されているトピックであり、20年後には人々の世界観を変える...

...

今日のアルゴリズム: 文字列内の単語を反転する

[[423004]]文字列が与えられたら、文字列内の各単語を 1 つずつ逆にします。例1:入力: 「...

...

ロボットがお手伝いします。楽しいメーデーを楽しみましょう!

現在、科学技術の発展に伴い、さまざまなインテリジェント技術や設備により、人々の休暇はますます快適で未...

自動運転・ホログラム投影!映画に出てくるブラックテクノロジーは私たちからどれくらい遠いのでしょうか?

春節休暇期間中、国内映画市場は活況を呈した。猫眼専門版のデータによると、丑年春節期間(2月11日~2...

...