免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5755 | 回复: 16
打印 上一主题 下一主题

Perl版有个有趣的题目:寻找最大公共串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-30 11:15 |只看该作者 |倒序浏览
原帖在此:http://bbs.chinaunix.net/thread-1333575-1-1.html


  1. 求两个字符串的最大公共子串,是一个程序员们常常考到和想到的题目,呵呵,我用perl实现了一下,听讲是当年微软面试时要求做的一个程序,写一个返回两个任意字串中最大公共串的函数,即abcdef 和 qcfbcc 返回值为bc语言不限
复制代码


感觉挺有难度的

论坛徽章:
0
2 [报告]
发表于 2008-12-30 13:03 |只看该作者
只是列出大概步骤和结果,没有写函数

str1 = "abcdef"
str2 = "qcfbcc/deabc"
list1 = []

min = str1
max = str2

if len(str1) > len(str2):
    min = str2
    max = str1

def cmp(x, y):
    if len(x) == len(y):
        return 0
    elif len(x) > len(y):
        return -1
    else:
        return 1

for i in range(len(min)):
    for j in range(len(min),0,-1):
        t = min[i:j]
        if t and t in max:
            list1.append(t)
        j += 1

list1.sort(cmp=cmp)
print list1

论坛徽章:
0
3 [报告]
发表于 2008-12-30 13:12 |只看该作者
自己编了一个,只打印出第一个最长子串

  1. #!/usr/bin/env python

  2. from sys import argv, exit

  3. def find_max_substr(a, b):
  4.         position = 0
  5.         lengh = 0
  6.        
  7.         for i in range(len(a)):
  8.                 for j in range(len(b)):
  9.                         ii = 0; jj = 0;
  10.                         while(a[i+ii] == b[j+jj]):
  11.                                 ii += 1; jj += 1;
  12.                                 if i+ii > len(a)-1 or j+jj > len(b)-1: break
  13.                         if(jj > lengh):
  14.                                 position = i; lengh = jj;
  15.        
  16.         print a[position:position+lengh]


  17. if __name__ == '__main__':
  18.         if len(argv) < 3:
  19.                 print "Usage: cmd str1 str2"
  20.                 exit(1)
  21.         find_max_substr(argv[1], argv[2])
复制代码

[ 本帖最后由 爱知 于 2008-12-30 13:23 编辑 ]

评分

参与人数 1可用积分 +5 收起 理由
xiaoyu9805119 + 5 不错

查看全部评分

论坛徽章:
0
4 [报告]
发表于 2008-12-30 13:38 |只看该作者

回复 #3 爱知 的帖子

不错,不过看上去有点C的味道。

论坛徽章:
0
5 [报告]
发表于 2008-12-30 17:02 |只看该作者
Dynamic programming

论坛徽章:
0
6 [报告]
发表于 2008-12-31 02:42 |只看该作者
楼上写得太差了。这种程序能加凤爪,实在是在侮辱Python。

楼上的思路,无非是列举出一个字符串的所有字串,然后一个一个判断,是不是在另一个字符串里。要枚举出所有字串,最简单的,就是递归了。具体数学里,第一课就是递归,但是为什么到现在还有这么多人不会用。


  1. def substr_gen(s):
  2.     if len(s) == 1:
  3.         yield s
  4.         raise StopIteration
  5.     else:
  6.         yield s
  7.         for i in substr_gen(s[1:]):
  8.             yield i
  9.         for i in substr_gen(s[:-1]):
  10.             yield i
复制代码


但是这个算法有问题。那就是,那所生成的substr里面有重复。因此比较好的算法,还是LCS。不过Py有Py的风格。

下面就是分析。


  1. String A :   AAAAAAA
  2. String B:   BBB
  3. 投影      :       X
复制代码


然后字符串B向右移动一位,下面的投影就变成两位了。然后以此类推,直到最后,字符串B的第一个字符同字符串A的最后一个字符重叠。

下面还是一个generator

  1. def string_pair_gen(s1, s2):
  2.     length = len(s1) + len(s2) - 1
  3.     _s1 = '\0' * (length - len(s1)) + s1
  4.     _s2 =  s2 + (length - len(s2)) * '\0'

  5.     while len(_s1) != 0:
  6.         yield _s1, _s2
  7.         _s1 = _s1[1:]
  8.         _s2 = _s2[:-1]
复制代码


这里的'\0' 是padding,因此判断投影的时候要注意。


此外,我就是shhgs。不知道flw又发什么神经了,把我的账号封了。请版主帮忙解封我的账号。

[ 本帖最后由 efhilt 于 2008-12-31 03:12 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-12-31 03:59 |只看该作者
这不是传说中的 LCS 吗 :wink:
softy 该用户已被删除
8 [报告]
发表于 2008-12-31 04:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
softy 该用户已被删除
9 [报告]
发表于 2008-12-31 04:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2008-12-31 11:40 |只看该作者

回复 #6 shhgs 的帖子

自认为写的不好(算法,Py风格)

功夫不够,尚需努力

^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP