题目描述
在一行中输入一个字符串数组一,如果其中一个字符串的所有以索引0开头的子串在数组中都有那么这个字符串就是潜在密码,在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序一最大的为唯一的真正的密码,求唯一的真正的密码。
输入描述
无
输出描述
无
用例
输入
h he hel hell hello o ok n ni nin ninj ninja
输出
ninja
按要求,hello、ok、ninja一都是潜在密码。
说明
检查长度,hello、ninja是真正的密码。检查字典序,ninja是唯一真正密码。
思路
从长度为1的字符串开始逐个寻找可以累加的后续字符串,通过递归遍历所有字符串,找到同一系列里面最长的那个,即所有的“潜在密码”(潜在密码的子串按题目描述也是一个潜在密码,但是一定不是最长的,自动忽略),再找到“潜在密码”中最长的一批,最后按String的copareTo()排序,最后那个就是字典序最大的
代码
import java.util.ArrayList;
import java.util.Scanner;
class Main {
public static String[] sArray;
public static ArrayList<String> result = new ArrayList<>();
public static ArrayList<String> realResult = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
sArray = in.nextLine().split(" ");
//直接从空字符串找起,获取结果
find("");
//找到最大长度
int maxLen = 0;
for (String s : result) {
if (s.length() > maxLen) {
maxLen = s.length();
}
}
//找到最长字符串
for (String s : result) {
if (s.length() == maxLen) {
realResult.add(s);
}
}
realResult.sort(String::compareTo);
System.out.println(realResult.get(realResult.size() - 1));
}
public static void find(String s) {
boolean over = true;
for (String s1 : sArray) {
//寻找比s长一个的字符串(可能不止一个,那也没关系)
if ((s1.length() == s.length() + 1) && s1.startsWith(s)) {
//如果找到了,则不能结束,继续下一轮寻找
over = false;
find(s1);
}
}
//没找到,递归结束,s是最终结果,加入result
if (over) {
result.add(s);
}
}
}