编程沙龙(09)
IT商界
本月有奖问答题目:
对于任意两个字符串s1和s2(字符串中字符只限26个小写的英文字母)的最长公共子序列lcs(s1,s2)是s1和s2中都出现的最长子序列。例如,tie是striped和tiger的最长公共子序列。
要求写一个程序,用户输入s1和s2,计算并显示出它们的最长公共子序列lcs(s1,s2)。
做这道题,读者朋友可以用你最擅长的语言和编程工具来完成。答题方式为:把你的答案发送到software@cpcw.com,邮件主题写上“算法演义答题”。我们会从中选取答题最好的参赛者,并赠送精美奖品。
为什么要用Pascal
有不少朋友来信提意见说:“为什么“算法演义”里范例只用Pascal语言,为什么不使用C/C++或者Basic语言?”
答:因为我们版面的限制,我们无法就一个问题同时给出几种语言的范例程序,希望大家谅解。关于这个问题我们目前的解决办法有两方面,一是轮换着使用不同语言的范例程序,二是在网上可以提供多种语言实现的源代码供读者朋友们下载。另外,我建议读者朋友有时间的话可以尝试着多学习几种语言,这样同别人交流编程经验或是在网上查找需要的资料都会方便很多。当然不一定要很深入地学习,只要做到能读懂程序,把握核心思想就可以。以我自己的经验来看,如果已经有一种语言的基础,那按照读懂程序代码的标准来学习另一种语言大约就是几天的事。而且Pascal/Object Pascal和Basic以及Java语言有很多相似的地方,学起来应该有很好的互通性。
比较复杂的是C/C++语言,特别是关于指针的大量运用。学习多种语言,首先是了解数据类型的对应关系以及变量声明的样式,这方面网上的资料很多。其次是了解程序的基本要素,例如循环、判断怎么写,函数的定义以及实参形参使用等等。最后了解常用的库函数。这里有个工具可以推荐给大家,这是一个可以将C语言的头文件转换成Pascal文件的工具headconv,下载地址是http://www.drbob42.com/headconv。
lcs(eye,excite) 应该是e还是ee?
读者 刘旭亮:我对那道题目理解还不是很清楚。如果两个单词有重复的两个字母,那么求出来的结果是一个还是两个?
答:我们要的是最长公共子串,所以lcs(eys,excite)是ee。