📌  相关文章
📜  按字典顺序生成给定字符串的不同子序列

📅  最后修改于: 2022-05-13 01:57:07.930000             🧑  作者: Mango

按字典顺序生成给定字符串的不同子序列

给定一个字符串s,列出给定字符串S 的所有可能的字母组合。如果有两个字符串具有相同的字符集,则打印两个字符串的字典最小排列
对于字符串abc,按字典顺序子序列的列表是 a ab abc ac b bc c
例子:

Input : s = "ab"
Output : a ab b

Input  : xyzx
Output : x xx xy xyx xyz xyzx xz xzx y
         yx yz yzx z zx

这个想法是使用一个集合(使用自平衡 BST 实现)来存储子序列,以便可以测试重复项。
为了生成所有子序列,我们一个一个地删除每个字符并重复剩余的字符串。

C++
// C++ program to print all distinct subsequences
// of a string.
#include 
using namespace std;
 
// Finds and stores result in st for a given
// string s.
void generate(set& st, string s)
{
    if (s.size() == 0)
        return;
 
    // If current string is not already present.
    if (st.find(s) == st.end()) {
        st.insert(s);
 
        // Traverse current string, one by one
        // remove every character and recur.
        for (int i = 0; i < s.size(); i++) {
            string t = s;
            t.erase(i, 1);
            generate(st, t);
        }
    }
    return;
}
 
// Driver code
int main()
{
    string s = "xyz";
    set st;
    set::iterator it;
    generate(st, s);
    for (auto it = st.begin(); it != st.end(); it++)
        cout << *it << endl;
    return 0;
}


Java
// Java program to print all distinct subsequences
// of a string.
import java.util.*;
 
class GFG {
 
    // Finds and stores result in st for a given
    // string s.
    static void generate(Set st, String s)
    {
        if (s.length() == 0) {
            return;
        }
 
        // If current string is not already present.
        if (!st.contains(s)) {
            st.add(s);
 
            // Traverse current string, one by one
            // remove every character and recur.
            for (int i = 0; i < s.length(); i++) {
                String t = s;
                t = t.substring(0, i) + t.substring(i + 1);
                generate(st, t);
            }
        }
        return;
    }
 
    // Driver code
    public static void main(String args[])
    {
        String s = "xyz";
        TreeSet st = new TreeSet<>();
        generate(st, s);
        for (String str : st) {
            System.out.println(str);
        }
    }
}
 
// This code has been contributed by 29AjayKumar
// modified by rahul_107


Python 3
# Python program to print all distinct
# subsequences of a string.
 
# Finds and stores result in st for a given
# string s.
def generate(st, s):
    if len(s) == 0:
        return
 
    # If current string is not already present.
    if s not in st:
        st.add(s)
 
        # Traverse current string, one by one
        # remove every character and recur.
        for i in range(len(s)):
            t = list(s).copy()
            t.remove(s[i])
            t = ''.join(t)
            generate(st, t)
 
    return
 
 
# Driver Code
if __name__ == "__main__":
    s = "xyz"
    st = set()
    generate(st, s)
    for i in st:
        print(i)
 
# This code is contributed by
# sanjeev2552


C#
// C# program to print all distinct subsequences
// of a string.
using System;
using System.Collections.Generic;
 
class GFG {
 
    // Finds and stores result in st for a given
    // string s.
    static void generate(HashSet st, String s)
    {
        if (s.Length == 0) {
            return;
        }
 
        // If current string is not already present.
        if (!st.Contains(s)) {
            st.Add(s);
 
            // Traverse current string, one by one
            // remove every character and recur.
            for (int i = 0; i < s.Length; i++) {
                String t = s;
                t = t.Substring(0, i) + t.Substring(i + 1);
                generate(st, t);
            }
        }
        return;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String s = "xyz";
        HashSet st = new HashSet();
        generate(st, s);
        foreach(String str in st)
        {
            Console.WriteLine(str);
        }
    }
}
 
/* This code contributed by PrinciRaj1992 */


Javascript


输出:

x
xy
xyz
xz
y
yz
z