真正的密码

题目描述
在一行中输入一个字符串数组一,如果其中一个字符串的所有以索引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);
        }
    }
}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值