真正的密码
题目描述
- 一行中输入一个字符串数组,如果其中一个字符串的所有以索引0开头的子串在数组中都有,那么这个字符串就是潜在密码
- 在所有潜在密码中最长的是真正的密码,如果有多个长度相同的真正的密码,那么取字典序最大的为唯一的真正的密码,求唯一的真正的密码。
输入描述
一个字符串 字符之间用空格隔开
输出描述
真正的那个密码字符串
用例
输入 | h he hel hell hello o ok n ni nin ninj ninja |
输出 | ninja |
说明 | 按要求,hello、ok、ninja都是潜在密码。 检查长度,hello、ninja是真正的密码。 检查字典序,ninja是唯一真正密码。 |
输入 | a b c d f |
输出 | f |
说明 | 按要求,a b c d f 都是潜在密码。 检查长度,a b c d f 是真正的密码。 检查字典序,f是唯一真正密码。 |
源码和解析
解析:
- 字符串按长度降序排序,若长度相同,则按字母顺序降序排序。
- 遍历字符串集合,从前往后匹配,找到第一个满足条件的即可
示例代码:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class T32 {
public static void main(String[] args) {
String input="h he hel hell hello o ok n ni nin ninj ninja";
List<String> wordList=new ArrayList<String>();
String[] wordArr=input.split(" ");
for(String w:wordArr){
wordList.add(w);
}
wordList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//按长度降序排序
if(o1.length()>o2.length())return -1;
if(o1.length()<o2.length())return 1;
//按字符排序
for(int i=0;i<o1.length();i++){
if(o1.charAt(i)>o2.charAt(i)) return -1;
if(o1.charAt(i)<o2.charAt(i)) return 1;
}
return 0;
}
});
System.out.println(wordList);
for(String word:wordList){
//双指针校验,是否全包含
int left=0;
int right=1;
while(wordList.contains(word.substring(left, right))){
if(right==word.length()){
System.out.println(word);
return;
}
right++;
}
}
}
}
代码运行示例: