输入一个字符串(不包含空格),请寻找输入中包含的所有蛇形字符串。
蛇形字符串定义:
1、蛇形字符串由连续的字符对组成,其特点如下:
1.1 字符对定义:字符对由同一字母的大写和小写组成(前大后小),如Aa,Dd
1.2 蛇形字符串中包含的字符对,必须是连续字母,并按照字母顺序排序。如AaBbCc
2、从输入中寻找字符组成蛇形字符串(字符顺序不限),符合规则:
2.1 每次寻找必须是最长的蛇形字符串
2.2 使用过的字符不能重复使用
输入描述:
一个字符串(不含空格,字符串长度<= 5000)
输出描述:
1、所有包含的蛇形字符串,按照首字母升序排列(即A在Z前)
2、同一个首字母的情况,按照蛇形字符串的长度降序输出
3、如果没有找到输出Not Found
输入示例(自己随便测试的)
DAFHAGFAHFIUHRjkfhbdajfhkEHFUWEIHAJSDKHncnthasrkjhaejsavbdcnskdscnjkdfhgbvsdfdnfkhgj&*(&%^&*(bdvdhjBSDZVBDFBDVH
输出示例:
AaBb
AaBb
AaBb
Aa
DdEeFfGgHh
DdEeFf
Dd
Dd
Dd
Ff
Ff
Ff
Hh
Hh
Hh
Hh
Hh
Hh
JjKk
RrSs
Ss
Vv
Vv
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
Map<Character, Integer> mA = new HashMap<>(); // 存储大写字母
Map<Character, Integer> ma = new HashMap<>(); // 存储小写字母
for (char ss : s.toCharArray()) {
if (ss >= 'A' && ss <= 'Z') {
mA.put(ss, mA.getOrDefault(ss, 0) + 1);
}
if (ss >= 'a' && ss <= 'z') {
ma.put(ss, ma.getOrDefault(ss, 0) + 1);
}
}
for (Map.Entry<Character, Integer> entry : mA.entrySet()) {
char key = entry.getKey();
int value = entry.getValue();
if (ma.containsKey((char) (key + 32))) {
continue;
} else {
mA.remove(key);
}
}
if (mA.isEmpty()) {
System.out.println("Not Found");
return;
}
StringBuilder tmp = new StringBuilder();
Map.Entry<Character, Integer> pre = null;
Map.Entry<Character, Integer> cur = null;
while (!mA.isEmpty()) {
pre = mA.entrySet().iterator().next();
cur = mA.entrySet().iterator().next();
if (cur.getValue() == 0) {
mA.remove(cur.getKey());
continue;
}
tmp.append(cur.getKey()).append((char) (cur.getKey() + 32));
cur.setValue(cur.getValue() - 1);
pre = cur;
while (cur != null && cur.getValue() > 0 && cur.getKey() == pre.getKey() + 1) {
tmp.append(cur.getKey()).append((char) (cur.getKey() + 32));
cur.setValue(cur.getValue() - 1);
pre = cur;
cur = mA.higherEntry(cur.getKey());
}
System.out.println(tmp.toString());
tmp.setLength(0);
}
}
}