2

段落内の回文語の数とその出現回数を数えるプログラムを作りたい

ルールと仮定:

  1. 入力: ユーザーは、できるだけ多くの文を含む段落を入力できます。各単語は空白で区切られ、各文はピリオドで区切られます。
  2. 出力: 入力で見つかった回文語のリストとその出現回数。
  3. 単語の直前または直後の句読点は無視されますが、単語内の句読点はカウントされます。回文は大文字と小文字も無視します。を。ホンダ シビックを所有しています。Civicis 回文、単語の後の句読点は無視されます。b. 私の弟は眠っています。li'l は回文ではありません。単語の中に句読点があるからです。

サンプル入力:

オットーは犬を飼いたがっています。彼が通りを歩いてペットショップに足を踏み入れようとすると、ドアに掛かっている「ペットを踏まないでください」と書かれた看板が見えます。オットーはペットショップでたくさんの動物を見ます。彼は鳥を見ます。彼はリスを見ます。彼はカメレオンを見ます。彼は犬を見ます。「犬の値段は?」オットーは言います。「10ドル」と男は言います。オットーは男に腱を与える。オットーは犬を買います。犬はオットーと一緒に家に帰ります。今、オットーは犬を飼っています。「神に感謝します。今、私は犬を飼っています」と彼は独り言を言います。

サンプル出力: Otto = 7 A = 5 Sees = 6

私のコードは:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PalindromeProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Console.WriteLine("Enter a String"); 
            string s = Console.ReadLine();
            string words = s.ToLower();
            string[] hasil = words.Split(' ');
            foreach (string temp in hasil)
            {
                string str = string.Empty;
                int x = temp.Length;

                for (int y = x - 1; y >= 0; y--)
                {
                    str = str + temp[y];
                }

                int count = 0;
                if (str == temp)
                {
                    count++;
                    Console.WriteLine(temp + " is palindrome = " + count);
                }
                i++;
            }
        }
    }
} 

そして私のコードの出力結果、paragraphtを入れたとき:

オットーは犬を飼いたがっています。彼が通りを歩いてペットショップに足を踏み入れようとすると、ドアに掛かっている「ペットを踏まないでください」と書かれた看板が見えます。オットーはペットショップでたくさんの動物を見ます。彼は鳥を見ます。彼はリスを見ます。彼はカメレオンを見ます。彼は犬を見ます。「犬の値段は?」オットーは言います。「10ドル」と男は言います。オットーは男に腱を与える。オットーは犬を買います。犬はオットーと一緒に家に帰ります。今、オットーは犬を飼っています。「神に感謝します。今、私は犬を飼っています」と彼は独り言を言います。

私の出力プログラムは次のとおりです。

otto は回文 = 1 a は回文 = 1 otto は回文 = 1 sees は回文 = 1

次のような出力プログラムが必要です。

単語 Otto = 7、単語 A = 5、単語 Sees = 6

出力結果を修正してください...

4

2 に答える 2

4

次の手順で、パイプラインを介してテキストを処理するとします。

  1. テキストを単語に分割する
  2. 回文を見つける
  3. 同じ単語をバケットにグループ化する
  4. バケットをワードでプロジェクションにマップすると、バケット内のカウントになります
  5. 射影をリストに抽出する
  6. そして、そのリストをコンソールに出力します

.

var s = @"<<< your input string here >>>";

var result = Regex.Matches(s, @"\w+").Cast<Match>() //1
        .Select(m => m.Value.ToLower()) //1
        .Where(w => String.Join("", w.Reverse()) == w) //2
        .GroupBy(w => w) //3
        .Select(g => new {Word = g.Key, Count = g.Count()}) //4
        .ToList(); //5

result.ForEach(Console.WriteLine); //6

出力:

{ Word = otto, Count = 7 }
{ Word = a, Count = 5 }
{ Word = sees, Count = 6 }

句読点をカバーするかどうかは不明です -- 正規表現を微調整する必要があります。お任せします。:) 唯一のケースは、のような単語のアポストロフィだと思いますI'll。その場合は、正規表現パターンを\w|'+(つまり、任意の文字またはアポストロフィが 1 回以上出現することを意味します) に変更することで処理できます。

于 2012-12-19T17:32:49.223 に答える
3

これを行うには何十もの方法があります。頭の中で、段落を単語に分割し、重複を削除し、結果の単語ごとに回文かどうかを確認してください。

もちろん、このアルゴリズムを最適化する方法はたくさんあります。


コードを見ると、唯一のエラー (おそらくこの問題で最も複雑な問題) は、段落が正しく分割されていることです。string.Split(' ') を使用しました。これは、スペースで区切られた一連の文字のみが「単語」(配列内の項目) に変換されることを意味します。ただし、結果の配列には、

犬」</p>

これは明らかに言葉ではありません。


正しい分割を実現する方法はたくさんあります。the_joric の回答では正規表現を使用していましたが、これは強力ですが、複雑すぎて理解しにくく、エラーにつながる可能性があります。

(この特定の問題に使用しないと言っているわけではありません。C# の初心者には大きすぎるかもしれないと言っているだけです)。

だから私は別の方法で解決策を書いてみます:

特定の問題領域を表す単語を定義しましょう。私にとって単語とは、文字のみを使用する 1 つまたは複数の文字のシーケンスです。つまり、「推測」、「何」、「asd」は単語です。ただし、「123asd」または「a1s2d3」または「asd123」はそうではありません。

一方、おそらく「asd」。ピリオドに続く単語です。そこで、文字以外のものはすべて「セパレータ」になるというヒューリスティックなアプローチに従いましょう。したがって、「123asd」は単語として「asd」を生成し、「a1s2d3」は「a」、「b」、および「c」を生成します。

const string validChars = "abcdefghijklmenopqrstuvwxyz";

List<string> GetAllWords(string inputSentence)
{
    var list = new List<string>();

    string word = string.Empty;
    foreach (var c in inputSentence.ToLower())
    {
        if (validChars.IndexOf(c) >= 0)
        {
            word += c;
        }
        else if (word != string.Empty)
        {
            list.Add(word);
            word = string.Empty;
        }
    }

    return list;
}

上記のメソッドは、ヒューリスティックに従って単語のリストを返します。すでに述べたように、これは完璧ではありませんが、適切に構成されたテキストを考慮すると、機能します。「string.Split(...)」をこのアルゴリズムに置き換えれば、準備完了です。

于 2012-12-19T17:39:17.603 に答える