import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String str = sc.next();
ArrayList<String> result = new ArrayList<String>();
result = listOfString(str);
for(String string: result) {
System.out.print(string+" ");
}
}
}
private static ArrayList<String> listOfString(String str) {
ArrayList<String> list = new ArrayList<String>();
Set<String> set = new TreeSet<String>();
for(int i = 0; i < str.length(); i++) {
set.add(String.valueOf(str.charAt(i)));
}
list.addAll(set);
set.clear();
for(int gap = 1; gap < str.length(); gap++) {
for(int i = 0; i < str.length(); i++) {
if(i + gap < str.length()) {
set.add(str.substring(i, i + gap + 1));
}
else {
list.addAll(set);
set.clear();
break;
}
}
}
return list;
}
}
//TreeSet 既能够排序又能去重! import java.util.Comparator; import java.util.Scanner; import java.util.TreeSet; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); TreeSet<String> set = new TreeSet<>(new StringLengthComparator()); for (int i = 0; i < str.length(); i++) { for (int j = i + 1; j <= str.length(); j++) { set.add(str.substring(i, j)); } } for (String i : set) { System.out.print(i+" "); } } } // 定义比较器 class StringLengthComparator implements Comparator<Object> { @Override public int compare(Object o1, Object o2) { String s1 = (String) o1; String s2 = (String) o2; int result = 0; if (s1.length() > s2.length()) { result = 1; } else if (s1.length() < s2.length()) { result = -1; } else { result = s1.compareTo(s2); } return result; }
随便写的,还可以优化,轻喷
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
//如果输入长度为1,直接打出字符串
if (input.length() <= 1) {
System.out.println(input);
}
List<String> tempList = new ArrayList<>();
for (int i = 0; i < input.length(); i++) {
for (int j = i; j < input.length(); j++) {
String frontStr = input.substring(i, j + 1);
if (!tempList.contains(frontStr)) {
tempList.add(frontStr);
}
}
}
Collections.sort(tempList, (o1, o2) -> o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length());
tempList.stream().forEach(s -> System.out.print(s + " "));
}
}
在Subset的基础上进行 了一些小小的改动。
子串必须是相邻字符的组合,这点其实非常简单,直接利用 contains 方法判断即可。
输出组合必须去重,最初我想到的是利用Set来实现,但是其实也能通过List的contains方法来解决。
子串必须按照长度顺序排列,若长度相同则按照字典顺序排列。这个写一个比较器就能够 解决了。
详细代码如下:
(PS.写得非常直白,仅做一个抛砖引玉的作用~有更好的解法欢迎分享o(^▽^)o)
关于Subset这道题目可以在LintCode/LeetCode上找到,同样的解法和解释可以参见:
https://github.com/cherryljr/LintCode/blob/master/Subsets%20II.java
欢迎大家follow我( ▼-▼ )
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if (str.length() <= 1) {
System.out.println(str);
}
List rst = new ArrayList();
helper(rst, new StringBuilder(), 0, str);
Collections.sort(rst, (a, b) -> a.length() == b.length()
? a.compareTo(b) : a.length() - b.length());
for (int i = 0; i < rst.size(); i++) {
System.out.print(rst.get(i) + " ");
}
}
public static void helper(List rst, StringBuilder sb, int start, String str) {
if (rst.contains(sb.toString())) {
return;
}
if (sb.length() == 1) {
rst.add(sb.toString());
} else if (sb.length() > 1 && str.contains(sb.toString())) {
rst.add(sb.toString());
}
for (int i = start; i < str.length(); i++) {
sb.append(str.charAt(i));
helper(rst, sb, i + 1, str);
sb.deleteCharAt(sb.length() - 1);
}
}
}