📜  门| GATE-CS-2001 |问题15(1)

📅  最后修改于: 2023-12-03 15:42:15.049000             🧑  作者: Mango

问题15

题目描述

给定一个字符串S和一个字符k。你需要从S中删除一个k数量不定的子字符串,然后对S进行重新排序,你需要输出可以得到的所有可能的字符串。

输入

字符串S和字符k(1<=|S|, |k|<=100)。

输出

对于输入中的每一个字符串S和字符k,输出可以得到的所有可能的字符串。每个字符串都应该单独输出,每一行输出一个字符串。如果无法得到任何字符串,请输出“-1”。

样例
输入样例
S = "strong"
k = 'n'
输出样例
gorst
grost
grots
sorgt
sort
storg
strog
torgs
torsg
tsgor
tsorg
解题思路

这道题目需要我们删除字符串中的一个子字符串,并对字符串进行重新排序。可以使用递归的方法进行处理。首先,我们要找到所有包含字符k的子字符串,将这些子字符串删除,并对字符串进行重新排序;接下来,我们需要对每个得到的新字符串再进行相同的处理,直到字符串不包含字符k为止。

代码实现
def delete_and_sort(s, k):
    if k not in s:
        return [s]
    res = []
    for i in range(len(s)):
        if s[i] == k:
            new_s = s[:i] + s[i+1:]
            for j in delete_and_sort(new_s, k):
                res.append(j)
    return res

S = input("Input the string S: ")
k = input("Input the character k: ")
res = delete_and_sort(S, k)
if res == []:
    print("-1")
else:
    for i in sorted(list(set(res))):
        print(i)
时间复杂度

假设原字符串S长度为n,字符k在S中出现m次,则递归深度不超过m层,每层需要遍历字符串S,时间复杂度为O(n),总时间复杂度为O(nm)。