回 帖 发 新 帖 刷新版面

主题:第62次编程比赛

考虑到现在处于期末考试阶段,本次比赛结束时间会迟些,目前定于1月19日晚上12时结束。结束后偶会发解题报告。

[size=3]题目:最长公共子序列 ★★★★★★[/size]

[color=0000FF]题目描述:[/color]
给定一个序列a,b,c,d,e,f,g,
其子序列的定义就是在当中任意删掉若干个元素,
例如a,b,e,g就是其中一个子序列。
现给定两个字符串,要求出它们的最长公共子序列的长度

[color=0000FF]输入:[/color]
多组测试数据,每两个字符串组成一组,
中间用空格或者换行符分隔
单个字符串最大长度为200000字节,或者100000个全角(或混合)字符。
以EOF标志结束输入。

[color=0000FF]输出:[/color]
对于每组测试数据,输出一行,每行仅输出一个数,
表示它们的最长公共子序列的长度

[color=0000FF]样例输入:[/color]
大家好 才是真的好
abcdefg acegbdf
天气真是好 这个天气就是好
Congratulations 恭喜你

[color=0000FF]样例输出:[/color]
1
4
4
0

[color=0000FF]其它信息:[/color]
连续两个ascii>127的字符应当视为全角字符对待,要看成一个整体。
但如果相邻两个一个>127,但另一个在127以内,那么这两个
不应该作为全角字符看待。

[color=FF0000]代码提交[/color]:请把您的完整代码直接回复于本帖子,回复帖子将不可见,
但在结帖以前你仍然可以编辑您的帖子。
如果您希望能够马上测试您的代码,请提交到[url]http://yzfy.org/bbs/viewthread.php?tid=611[/url]
如果对题目有任何疑问,请在提问帖子[url]http://www.programfan.com/club/post-265092.html[/url]里问。

回复列表 (共11个回复)

11 楼

//本程序调试环境: Microsoft Visual C++ 6.0
//comBoy 2008 01 19

#include <iostream>

using namespace std;
//=====================================================================
void input(char *&data,int& size);

//=====================================================================
void main()
{
    char* data1,* data2;//存放两个用于比较的字符串
    int size1,size2;//字符串长

    //读入字符串
    input(data1,size1);
    input(data2,size2);

    //求两字符串的最长公共子序列的长度
    int i,j;//循环控制变量
    double common;//存放两字符串的最长公共子序列的长度
    
    for(i=0;i<size1;i++)
        for(j=0;j<size2;j++)
            if(data1[i]==data2[j])
            {
        if((int)data[i]<0)//此为文字及全角专设
                    common+=0.5;
                else
                    common++;
                data2[j]=' ';//防止重复
                break;
            }
       
    cout<<common<<endl;
}
//该函数用于读入数据
//它返回字符串及其大小

void input(char *&data,int& size)
{
   char ch;//存放读入的字符
   int i;//循环控制变量
   char* temp;//用于替data保管数据
   size=0;//初始化字符个数为0

   //开始读入数据
   while((ch=cin.get())!='\n'&&size<=2000000)//一个char字符1kb
   {
       size++;//字符计数开始
       if(!(data=new char[size]))//为data申请size大小的空间
            exit(1);
       for(i=0;i<size-1;i++)
           data[i]=temp[i];//让上次的data的数据返回data
       data[size-1]=ch;//把读入数据存到data
       if(size>1)
           delete[] temp;//释放空间
       temp=data;//让temp存放当前的data
   }
}
测试数据:
abcdefghijklmnopqrstuvwxyz1234567890
abcdefghijklmnopqrstuvwxyz
hello
good
yes
ok
你好吗
我很好
gOOd
Oh!
输出:
26
1
0
1
1

我来回复

您尚未登录,请登录后再回复。点此登录或注册