使用递归来查找子序列

时间:2014-02-16 21:22:37

标签: python recursion

如果只有一个字符串(True)可以通过从s2中删除字符而转换为另一个字符串(s1),我需要一个程序返回s2。例如,如果s1 = stars2 = swewtffsafefr它将返回True

到目前为止我已经想出了这个:

def subsequence(s1, s2, pos=0):
    if pos < len(s1):
        subsequence(s1,s2, pos+1)
    else:
        return 0

我无法弄清楚如何删除s2中不在s1

中的字符

2 个答案:

答案 0 :(得分:3)

所以你知道你想要一个递归函数subseq(s1,s2)

首先你需要拿出你的基础

  1. s1 == s2,为此我们将返回true
  2. s1为空,为此我们也会返回true
  3. s2为空但s1不为,我们将返回false
  4. 其他一切
  5. 接下来你需要把它放到代码中

    1. if s1 in s2:return True
    2. if not s1: return True
    3. if not s2: return False
    4. #everything else
    5. 我们需要进一步分解其他一切

      1. 如果s1 [0] == s2 [0]推进两个指针
      2. 否则只提前s2
      3. def subseq(s1,s2):
            if s1 in s2: return True
            if not s1: return True
            if not s2: return False
            #everything else
            if s1[0] == s2[0]: return subseq(s1[1:],s2[1:])
            return subseq(s1,s2[1:])
        

答案 1 :(得分:1)

要删除s2中不在s1中的字符并不难,有很多方法

set_s1 = set([item for item in s1])
set_s2 = set([item for item in s2])

这可以获得s1和s2中唯一的字符

现在识别s2中不在s1

中的值
diff = set_s2.difference(set_s1)

现在从diff中删除s2中的字符(s2中的字符不在s1中)

if len(diff) == 0:
    break
else:
    new_s2 = ''
    for c in s2:
        if c not in diff:
            new_s2 = new_s2 + c

问题仍然是删除重复