【问题标题】:Detect word palindrome in a paragraph using C# [closed]使用 C# 检测段落中的单词回文[关闭]
【发布时间】:2012-12-19 17:16:34
【问题描述】:

我想做一个程序,目的是统计段落中回文词的个数及其出现次数

规则和假设:

  1. 输入:用户可以输入包含尽可能多的句子的段落。每个字 用空格隔开,每个句子用句点隔开。
  2. 输出:在输入中找到的回文词列表,以及它的数量 发生。
  3. 单词之前或之后的标点将被忽略,而标点 里面的话会算的。回文也忽略字母大小写。 一种。我有一辆本田思域。 Civicis palindrome,词后的标点符号是 忽略。 湾。我的小弟弟正在睡觉。 li'l 不是回文,因为有一个 单词中的标点符号。

示例输入:

奥托想要养一只狗。他走上街,即将踏入宠物 当他看到门上挂着“禁止携带宠物踏入”的标志时,他就去商店了。奥托 在宠物店看到很多动物。他看到了鸟。他看到了松鼠。他 看到变色龙。他看到了狗。 “那条狗多少钱?”奥托说。 “十美元,”男人说。奥托给了那个男人腱。奥托买了狗。这 狗和奥托一起回家。现在奥托有一条狗。 “感谢上帝,现在我有了一只狗,”他 对自己说。

样本输出: 奥托 = 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++;
            }
        }
    }
} 

以及我的代码的输出结果,当我放段落时:

奥托想要养一只狗。他走上街,正要走进宠物店,就看到门上挂着“禁止携带宠物”的牌子。奥托在宠物店看到了很多动物。他看到了鸟。他看到了松鼠。他看到了变色龙。他看到了狗。 “那条狗多少钱?”奥托说。 “十美元,”男人说。奥托给了那个男人腱。奥托买了狗。这只狗和奥托一起走回家。现在奥托有一条狗。 “感谢上帝,我现在有了一条狗,”他对自己说。

我的输出程序是:

otto 是回文 = 1 a 是回文 = 1 otto 是回文 = 1 sees 是回文 = 1

我想要这样的输出程序:

单词 Otto = 7,单词 A = 5,单词 Sees = 6

请修正我的输出结果...

【问题讨论】:

  • 显示您的代码。除非您向我们展示您已经完成的工作,否则我们无法帮助您。
  • 您需要为找到的每个回文存储一个唯一的计数。完成段落的迭代后,打印出你的发现
  • 您能在代码中添加一些 cmets 吗?我很难理解这个算法。另外,代码是否正在编译,还是给出错误的输出?
  • 如果这是作业,请适当标记。
  • @BrunoBrant, homework 标签已过时:stackoverflow.com/tags/homework/info

标签: c# palindrome


【解决方案1】:

假设您通过管道通过以下步骤处理文本:

  1. 将文本拆分为单词
  2. 查找回文
  3. 将相同的单词分组到桶中
  4. 使用 word 将存储桶映射到投影,并计入存储桶中
  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|'+ 来处理(这意味着任何字母或撇号,出现一次或多次)。

【讨论】:

  • 我认为你应该解释一下你的代码是做什么的......
  • 它找到回文并计算它们
  • 并非所有回文都已找到,例如“I”。
  • 他的意思不是“它是做什么的”,他的意思是“它是如何做到的”。您的回答虽然准确地回答了这个问题,但除了这个特定用户之外,对这个特定问题的任何人都没有帮助。当他遇到另一个与此类似的问题(但足够不同)并尝试使用此技术但失败时会发生什么?你没有做任何事情来“帮助”他,因为他会回来寻求更多帮助,这违背了 SO 的目的。
  • @BrunoBrant 是有意完成的(我删除了只出现一次的回文)。但最后我从问题中删除了那条线。谢谢
【解决方案2】:

有很多方法可以做到这一点。出于我的想法,尝试将段落拆分为单词,删除重复项并为每个结果单词,然后检查它是否是回文。

当然,优化此算法的方法有很多。


查看您的代码,唯一的错误 - 并且可能是此问题中最复杂的问题 - 正确分割了段落。您使用了 string.Split(' '),这意味着只有由空格分隔的字符序列才会转换为“单词”(数组中的项目)。但是,结果数组可能包含带有

的项

狗,”

这显然不是一个词。


有很多方法可以实现正确的拆分。 the_joric 答案使用了正则表达式,虽然功能强大,但过于复杂且难以理解,可能会导致错误。

(我并不是说我不会将它用于这个特定的问题;我只是说它对于 C# 新手来说可能是一个太大的飞跃)。

所以我会尝试以其他方式编写解决方案:

让我们为我们的特定问题域定义什么是单词,好吗?对我来说,word 是一个或多个仅使用字母的字符序列。所以,“guess”、“what”和“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-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多