(A卷,100分)- 最长的密码(Java & JS & Python)

题目描述

小王在进行游戏大闯关,有一个关卡需要输入一个密码才能通过,密码获得的条件如下:

在一个密码本中,每一页都有一个由26个小写字母组成的若干位密码,每一页的密码不同,需要从这个密码本中寻找这样一个最长的密码,

从它的末尾开始依次去掉一位得到的新密码也在密码本中存在。

请输出符合要求的密码,如果有多个符合要求的密码,则返回字典序最大的密码。

若没有符合要求的密码,则返回空字符串

输入描述

密码本由一个字符串数组组成,不同元素之间使用空格隔开,每一个元素代表密码本每一页的密码。

输出描述

一个字符串

用例

输入 h he hel hell hello
输出 hello
说明
输入 b ereddred bw bww bwwl bwwlm bwwln
输出 bwwln
说明

题目解析

本题和

含义相同,解法类似。

根据考友反馈,本题支持单字符为符合要求的密码。

JavaScript算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  const arr = line.split(" ");

  console.log(getResult(arr));
});

function getResult(arr) {
  arr.sort((a, b) =>
    a.length != b.length ? a.length - b.length : a == b ? 0 : a > b ? 1 : -1
  );

  const set = new Set(arr);

  let ans = "";

  while (arr.length) {
    const str = arr.pop();

    let end = str.length - 1;

    if (end === 0 && ans === "") {
      ans = str;
      continue;
    }

    while (set.has(str.substring(0, end))) {
      if (end === 1) {
        return str;
      } else {
        end--;
      }
    }
  }

  return ans;
}

优化逻辑

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("line", (line) => {
  const arr = line.split(" ");

  console.log(getResult(arr));
});

function getResult(arr) {
  arr.sort((a, b) =>
    a.length != b.length ? a.length - b.length : a == b ? 0 : a > b ? 1 : -1
  );

  const set = new Set(arr);

  while (arr.length) {
    const str = arr.pop();

    let end = str.length - 1;

    if (end === 0) {
      return str;
    }

    while (set.has(str.substring(0, end))) {
      if (end === 1) {
        return str;
      } else {
        end--;
      }
    }
  }

  return "";
}

Java算法源码

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String[] arr = sc.nextLine().split(" ");
    System.out.println(getResult(arr));
  }

  public static String getResult(String[] arr) {
    Arrays.sort(arr, (a, b) -> a.length() != b.length() ? a.length() - b.length() : a.compareTo(b));

    LinkedList<String> link = new LinkedList<>(Arrays.asList(arr));
    HashSet<String> set = new HashSet<>(link);

String ans = "";

    while (link.size() > 0) {
      String str = link.removeLast();
      int end = str.length() - 1;
  
  if(end == 0 && "".equals(ans)) {
  ans = str;
  continue;
  }

      while (set.contains(str.substring(0, end))) {
        if (end == 1) {
          return str;
        } else {
          end--;
        }
      }
    }

    return ans;
  }
}

优化逻辑

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String[] arr = sc.nextLine().split(" ");
    System.out.println(getResult(arr));
  }

  public static String getResult(String[] arr) {
    Arrays.sort(arr, (a, b) -> a.length() != b.length() ? a.length() - b.length() : a.compareTo(b));

    LinkedList<String> link = new LinkedList<>(Arrays.asList(arr));
    HashSet<String> set = new HashSet<>(link);

    while (link.size() > 0) {
      String str = link.removeLast();
      int end = str.length() - 1;

      if (end == 0) {
        return str;
      }

      while (set.contains(str.substring(0, end))) {
        if (end == 1) {
          return str;
        } else {
          end--;
        }
      }
    }

    return "";
  }
}

Python算法源码

# 输入获取
arr = input().split()


# 算法入口
def getResult(arr):
    arr.sort(key=lambda s: (len(s), [ord(c) for c in s]))
    setA = set(arr)

    ans = ""

    while len(arr) > 0:
        s = arr.pop()
        end = len(s) - 1

        if end == 0 and ans == "":
            ans = s
            continue

        while s[:end] in setA:
            if end == 1:
                return s
            else:
                end -= 1

    return ans


# 算法调用
print(getResult(arr))

优化逻辑

# 输入获取
arr = input().split()


# 算法入口
def getResult(arr):
    arr.sort(key=lambda s: (len(s), [ord(c) for c in s]))
    setA = set(arr)

    while len(arr) > 0:
        s = arr.pop()
        end = len(s) - 1

        if end == 0:
            return s

        while s[:end] in setA:
            if end == 1:
                return s
            else:
                end -= 1

    return ""


# 算法调用
print(getResult(arr))

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?