📜  c# + 字符串中最长的条纹 - C# (1)

📅  最后修改于: 2023-12-03 14:39:42.138000             🧑  作者: Mango

C# + 字符串中最长的条纹

用C#语言编写程序来找到给定字符串中的最长条纹(即始于字符串开头并在其中多次重复的字符串)。

问题分析

将字符串分成两个部分,第一部分是重复的条纹,第二部分是重复的次数。假设字符串中有一个最长的条纹,它的长度为L,并且字符串的长度为N。因此,条纹的长度肯定小于等于N / 2。

从长度1开始,我们将字符串分成两个部分:条纹和次数。如果次数是字符串的一个整数倍,并且由该条纹形成,该条纹就是候选条纹。对于每个长度L,我们会发现可能有几个候选条纹。我们选择时间最久的一个作为最长条纹。

方案

根据上述分析,我们可以得到以下步骤:

  1. 从长度1开始循环遍历字符串S,直到S.Length / 2。
  2. 将S分成条纹和次数两个部分。如果次数是字符串的整数倍,并且由条纹形成,则该条纹是候选条纹之一。
  3. 对于每个长度L,找到时间最久的条纹,它是最长条纹。
  4. 返回最长条纹。
代码实现
using System;

namespace LongestStripe
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "abababc";
            var longestStripe = FindLongestStripe(input);
            Console.WriteLine("Longest Stripe: " + longestStripe);
        }

        static string FindLongestStripe(string s)
        {
            int n = s.Length;
            int longestLength = 0;
            string longestStripe = "";

            for (int i = 1; i <= n / 2; i++)
            {
                if (n % i == 0)
                {
                    string sub = s.Substring(0, i);
                    int repeat = n / i;
                    bool isStripe = true;

                    for (int j = 1; j < repeat; j++)
                    {
                        if (sub != s.Substring(j * i, i))
                        {
                            isStripe = false;
                            break;
                        }
                    }

                    if (isStripe && sub.Length > longestLength)
                    {
                        longestLength = sub.Length;
                        longestStripe = sub;
                    }
                }
            }

            return longestStripe;
        }
    }
}
测试

我们使用示例字符串abababc来测试这个程序。该字符串的最长条纹是ab,程序的输出将是:

Longest Stripe: ab