1、题目描述
【题目描述】
在一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码,
在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为唯一的真正的密码,求唯一的真正的密码。
【示例1】
输入
h he hel hell hello o ok n ni nin ninj ninja
输出
ninja
说明
按要求,hello、ok、ninja都是潜在密码。
检查长度,hello、ninja是真正的密码。
检查字典序,ninja是唯一真正密码。
【示例2】
输入
a b c d f
输出
f
说明
按要求,a b c d f 都是潜在密码。
检查长度,a b c d f 是真正的密码。
检查字典序,f是唯一真正密码。
2、解题思路
将输入的字符串存入数组;使用HashSet存储这些字符串,确保唯一性;
遍历输入的字符串数组,针对每一个字符串,从索引1开始,判断其所有以索引0开头的子串是否在HashSet中;如果所有子串都在HashSet中,说明当前字符串是潜在密码;
如果当前潜在密码长度大于真正的密码长度,更新真正的密码为当前潜在密码;
如果当前潜在密码长度等于真正的密码长度,但字典序大于真正的密码,更新真正的密码为当前潜在密码;
3、参考代码
java
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class 真正的密码 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String[] strings = in.nextLine().split(" ");
Set<String> wordSet = new HashSet<>();
for (String string : strings) {
wordSet.add(string);
}
String realPwd = "";
// 遍历输入的字符串数组
for (String string : strings) {
boolean isPwd = false;
for (int i = 1; i < string.length(); i++) {
String subStr = string.substring(0, i);
if (!wordSet.contains(subStr)) {
isPwd = true;
break;
}
}
// 如果所有子串都在set里,说明当前字符是潜在密码
if (isPwd) {
if (string.length() > realPwd.length()) {
realPwd = string;
}
if (string.length() == realPwd.length() && string.compareTo(realPwd) > 0) {
realPwd = string;
}
}
}
System.out.println(realPwd);
}
}
}