按字典顺序生成给定字符串的不同子序列
给定一个字符串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