我被要求编写一个程序,使用ArrayList查找String及其Sub-Strings的排列。我提出了一个解决方案,但它没有显示所需的输出。所以,如果有人能在这方面给我一点启发,我将不胜感激。
问题如下:
计算字符串及其子字符串的所有排列。例如,给定一个字符串S,例如" abc",它应该输出一个字符串列表/数组retlist [a,b,c,ab,ba,ac,ca,bc,cb,abc,acb ,bac,bca,cab,cba]。您的代码应将S作为输入,并为置换列表生成retlist。除了有一个有效的代码之外,请优化代码以提高速度和内存的效率(我们将测试大字符串,它越快越好)。
如问题中所述,当排列一串" abc"时,它应该打印如下结果:
[a,b,c,ab,ba,ac,ca,bc,cb,abc,acb,bac,bca,cab,cba]
到目前为止我想出了什么:
import java.util.ArrayList;
import java.util.List;
public class Permutation {
public static void main(String[] args) {
enumerateSubString("abc");
}
public static List<String> enumerateSubString(String S_input) {
ArrayList<String> retlist = new ArrayList<String>();
int n = S_input.length();
if (n == 1) {
retlist.add(S_input);
} else {
for (int i = 0; i < n; i++) {
retlist.addAll(enumerateSubString(S_input.substring(0, i) + S_input.substring(i + 1, n)));
}
}
System.out.print(retlist);
return retlist;
}
}
我现在用上面的代码得到了结果:
[c] [b] [c,b] [c] [a] [c,a] [b] [a] [b,a] [c,b,c,a,b,a] < / p>
由于
答案 0 :(得分:0)
使用通用算法添加另一个答案。这将按所述顺序给出所有排列。希望这个解决目的
public class Test {
public static void main(String[] args) {
String s = "abc";
Map<Integer, List<String>> map = new HashMap<>();
List<String> strArray = new ArrayList<String>(Arrays.asList(s.split("")));
map.put(1, strArray);
if (strArray.size() > 1) {
new Test().enumerateSubString(strArray.size(), map);
}
System.out.println(map.values());
}
public void enumerateSubString(int n, Map<Integer, List<String>> map) {
if (!map.containsKey(n)) {
map.put(n, new ArrayList<>());
}
if (n == 2) {
// List of string with each having 1 character
List<String> list_1 = map.get(1);
// List of string which each having 2 characters
List<String> list_2 = new ArrayList<>();
for (int i = 0; i < list_1.size(); i++) {
for (int j = i + 1; j < list_1.size(); j++) {
list_2.add(list_1.get(i) + list_1.get(j));
list_2.add(swap(list_1.get(i) + list_1.get(j)));
}
}
// Map list_2 to key 2
map.put(n, list_2);
} else {
// Recursive function
enumerateSubString(n - 1, map);
// List of string with each having n-1 characters
List<String> list = map.get(n - 1);
// List of string with each having n characters
List<String> list_n = map.get(n);
// Add each character to list of n-1 to get n charater string list
for (String l1 : map.get(1)) {
for (String l : list) {
// this condition is to avoid repetation of charaters n
// String
if (l.indexOf(l1) < 0) {
list_n.add(l1 + l);
}
}
}
}
}
// Function to swap characters
private String swap(String str) {
String s1 = str.substring(1) + str.substring(0, 1);
return s1;
}}