zoukankan      html  css  js  c++  java
  • 求两字符串的最长公共子序列。。= =,hentai啊真hentai

    原先写的代码有些问题,这下修改了一次,,但是不是很完美,除了有字符串长度限制以外,有一些情况下的字符串会输出为一样的,主要因为回溯时虽然走了不同的路径,但是由于字符串中有重复的字符出现,导致显示出来的字符串还是一样的,解决办法就是将已经输出的最长公共子序列存起来,之后输出的从这里面进行筛选,没有的话再输出,并且将自己添加进去。。。。= =,,果然蛋疼

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

    namespace ConsoleApplication1
    {
    class Program
    {
    constlong t =1000; //t为运算时用的数组的大小,应该不小于两字符串的最大长度,此处定义为1000
    staticint[,] c =newint[t +1, t +1];
    staticint[,] b =newint[t +1, t +1];
    staticstring s ="";

    staticvoid Main(string[] args)
    {
    string X ="";
    string Y ="";
    Console.Write(
    "X: ");
    X
    += Console.ReadLine(); //此处定义X字符串
    Console.Write("Y: ");
    Y
    += Console.ReadLine(); //此处定义Y字符串
    Fuck(X, Y);
    Console.WriteLine(
    "The max length is "+ c[X.Length -1, Y.Length -1] +".\r\n");
    Print(X, Y, X.Length
    -1, Y.Length -1);

    Console.ReadKey();
    }

    //运算的函数
    staticvoid Fuck(string X, string Y)
    {
    int m = X.Length -1;
    int n = Y.Length -1;

    for (int i =1; i <= t; i++)
    {
    c[i,
    0] =0;
    }
    for (int j =0; j <= t; j++)
    {
    c[
    0, j] =0;
    }
    for (int i =1; i <= m; i++)
    {
    for (int j =1; j <= n; j++)
    {
    if (X[i] == Y[j])
    {
    c[i, j]
    = c[i -1, j -1] +1;
    b[i, j]
    =2;
    }
    else
    {
    if (c[i -1, j] >= c[i, j -1])
    {
    c[i, j]
    = c[i -1, j];
    b[i, j]
    =3;
    }
    else
    {
    c[i, j]
    = c[i, j -1];
    b[i, j]
    =1;
    }
    }
    }
    }
    }

    //显示输出的函数
    staticvoid Print(string X, string Y, int i, int j)
    {
    string r = s;
    if (i ==0|| j ==0)
    {
    char[] arr = s.ToCharArray();
    Array.Reverse(arr);
    if (s.Length == c[X.Length -1, Y.Length -1])
    Console.WriteLine(arr);
    s
    = r;
    return;
    }
    if (b[i, j] ==2)
    {
    s
    += X[i];
    Print(X, Y, i
    -1, j -1);
    }
    else
    {
    if (b[i, j] ==3)
    {
    Print(X, Y, i
    -1, j);
    if (b[i, j -1] ==2)
    {
    s
    = r;
    Print(X, Y, i, j
    -1);
    }
    }
    else
    {
    Print(X, Y, i, j
    -1);
    }
    }
    }
    }
    }
  • 相关阅读:
    不重复随机数生成
    centos 输入密码正确进不去系统
    程序退出异常_DebugHeapDelete和std::numpunct
    iptables导致数据包过多时连接失败
    linux服务器并发与tcmalloc
    Windows server 2008 被ntlmssp安装攻击 解决
    转载 html div三列布局占满全屏(左右两列定宽或者百分比、中间自动适应,div在父div中居底)
    WIN2003使用IP安全策略只允许指定IP远程桌面连接
    如何让电脑公司Win7系统自动关闭停止响应的程序
    win7 64的系统安装。net4.0总是提示安装未成功
  • 原文地址:https://www.cnblogs.com/kanone/p/2015109.html
Copyright © 2011-2022 走看看