首页 > 其他分享 >【字节青训营--还原原始字符串(中)】

【字节青训营--还原原始字符串(中)】

时间:2024-11-05 17:15:28浏览次数:3  
标签:输出 ab 字节 -- str1 样例 青训营 字符串 输入

问题描述

给定一个字符串 F,这个字符串是通过对某个初始字符串 S 执行若干次以下操作得到的:

  • 选择一个整数 K(其中 0≤K<∣S∣0≤K<∣S∣,∣S| 表示字符串 S 的长度)
  • 将 S 从第 K个位置(从0开始计数)到末尾的子串追加到 S 的末尾,即:S=S+S[K:]

输入格式

  • 输入为一个字符串 F,仅包含小写字母,长度不超过 1000。

输出格式

  • 输出一个字符串,表示可能的最短初始字符串 S。
  • 如果无法通过题目描述的操作得到字符串 F,则输出原字符串 F。

测试样例

样例1:

输入:str1 = "abbabbbabb"
输出:"ab"

解释:初始字符串 "ab" 可以通过以下步骤得到最终字符串:

  1. K=1K=1:"a[b]" → "a[b][b]"
  2. K=0K=0:"[abb]" → "[abb][abb]"
  3. K=2K=2:"ab[babb]" → "ab[babb][babb]"

样例2:

输入:str1 = "abbbabbbb"
输出:"ab"

解释:初始字符串 "ab" 可以通过以下步骤得到最终字符串:
"a[b]" → "a[b][b]"
"ab[b]" → "ab[b][b]"
"[abbb]" → "[abbb][abbb]"
"abbbabb[b]" → "abbbabb[b][b]"

样例3:

输入:str1 = "jiabanbananananiabanbananananbananananiabanbananananbananananbananananbanananan"
输出:'jiaban'

样例4:

输入:str1 = "selectecttectelectecttectcttectselectecttectelectecttectcttectectelectecttectcttectectcttectectcttectectcttect"
输出:'select'

样例5:

输入:str1 = "discussssscussssiscussssscussssdiscussssscussssiscussssscussssiscussssscussss"
输出:'discus'

样例6:

输入:str1 = "lflsdjlskjflskjfl"
输出:'lflsdjlskjfl'

提示

  1. 考虑如何判断一个字符串是否可以通过题目描述的操作得到
  2. 可以尝试从短到长枚举可能的初始字符串
  3. 时间复杂度应不超过 O(n2),其中 n 为输入字符串的长度

思路:直接递归搜索每一种可能性,时间复杂度很高,标签是贪心,没有什么思路,只能使用递归解决,个人觉得动态规划也可以做,可以试下。

public class Main {

    public static String solution(String str1) {
        //直接正向思考测试是否能进行转换

        //特殊情况
        if(str1.equals("")) return "";
        String s = "" + str1.charAt(0);
        if(s.repeat(str1.length()).equals(str1)) return s;

        //进行遍历判断
        for(int i = 2; i <= str1.length();i++){
            String str = str1.substring(0,i);
            if(get(str,str1)){
                return str;
            }
        }
        return "ab";
    }

    public static boolean get(String str, String target) {
        //核心实现
        // 进行一个递归出口判断
        if (!target.startsWith(str)) {
            return false;
        } else {
            if (str.length() == target.length()) {
                return true;
            }
        }

        // 进行一个判断
        for (int i = 0; i < str.length(); i++) {
            int count = str.length();
            if (str.length() < target.length())//防止进入死循环
                str = str + str.substring(i);
            if (get(str, target)) {
                return true;
            } else {
                // 当前的添加不正确,进行回溯寻找下一个路径
                str = str.substring(0,count);
            }
        }
        return false;
    }


    public static void main(String[] args) {
        // Add your test cases here

        System.out.println(solution("abbabbbabb").equals("ab"));
        System.out.println(solution("abbbabbbb").equals("ab"));
        System.out.println(solution("jiabanbananananiabanbananananbananananiabanbananananbananananbananananbanananan").equals("jiaban"));
        System.out.println(solution("selectecttectelectecttectcttectselectecttectelectecttectcttectectelectecttectcttectectcttectectcttectectcttect").equals("select"));
        System.out.println(solution("discussssscussssiscussssscussssdiscussssscussssiscussssscussssiscussssscussss").equals("discus"));
    }
}

标签:输出,ab,字节,--,str1,样例,青训营,字符串,输入
From: https://blog.csdn.net/yf3241610146/article/details/143500615

相关文章

  • 致病性-可能致病-良性-可能良性-意义不明CNV分类原则
    CNV分类按照国际标准,CNV可分为致病、可能致病、临床意义不明确、可能良性、良性五类,判断主要依据包括CNV是否涵盖蛋白编码基因或重要调控元件,蛋白编码基因的数量及所含基因或区域的剂量敏感性、文献报道、ClinVar、ClinGen、DECIPHER、OMIM等数据库报道情况、实验室内部数......
  • 云渲染与汽车CGI图像技术优势和劣势
    在数字时代,云渲染技术以其独特的优势在汽车CGI图像制作中占据了重要地位。云渲染通过利用云计算的分布式处理能力,将渲染任务分配给云端的服务器集群进行计算,从而实现高效、高质量的渲染效果。这种技术的优势主要体现在以下几个方面:高性能和可扩展性:云渲染能够利用云计算平台的......
  • 算法与数据结构——基数排序
    基数排序基数排序(radixsort)的核心思想与计数排序一致,也通过统计个数来实现排序。计数排序适用于数据量n较大但数据范围m比较小的情况。假设我们需要对n=106个学号进行排序,而学号是一个8位数字,这意味着数据范围m=108非常大,使用计数排序需要分配大量内存空间,而基数排序可以避免这......
  • 第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!
    10月26日-27日,由测试开发校企联合培养联盟主办、韩山师范学院承办、测吧(北京)科技有限公司及<火焰杯>软件测试开发大赛组委会协办的第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举行。本次峰会汇聚了来自全国各大高校的教师及企业嘉宾,旨在共同探讨软件测试教育的创新发展......
  • 5分钟上手 Kubernetes:精简实用的 Kubectl 命令速查宝典!
    对于刚开始学习Kubernetes的人来说,理解和掌握kubectl命令是入门的第一步。kubectl是Kubernetes的命令行工具,用于管理Kubernetes集群中的资源。在这篇文章中,我们将总结一些最常用的kubectl命令,通过简明的介绍和示例,让你在5分钟内快速上手Kubernetes,优雅地开始使用K8......
  • Synchronized用过吗,其原理是什么
    synchronized是由一对monitorenter/monitorexit指令实现的,monitor对象是同步的基本实现单元。在Java6之前,monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在Java6的时候,Java虚拟机......
  • 09.外观模式设计思想
    09.外观模式设计思想目录介绍01.外观模式基础1.1外观模式由来1.2外观模式定义1.3外观模式场景1.4外观模式思考1.5解决的问题02.外观模式实现2.1罗列一个场景2.2外观结构2.3外观基本实现2.4有哪些注意点2.5设计思想03.外观实例演示3.1需求分析3......
  • Synchronized用过吗,其原理是什么
    synchronized是由一对monitorenter/monitorexit指令实现的,monitor对象是同步的基本实现单元。在Java6之前,monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在Java6的时候,Java虚拟机......
  • Android高级进阶之路【二】十分钟彻底弄明白 View 事件分发机制
    前言Android事件分发机制是Android开发者必须了解的基础网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化等等今天,我将全面总结Android的事件分发机制,我能保证这是市面上的最全面、最清晰、最易懂的本文秉着“结论......
  • L9613/L9637国产替方案DP9637电摩汽车K总线收发控制器
    DP9637支持ISO9141协议与L9613和L9637兼容,只需要修改电路和控制信号时序逻辑有参考资料,欢迎咨询DP9637是一款应用于汽车诊断系统中的单片总线收发器,为汽车诊断系统提供双向串行通信。该收发器既能工作在发射模式,也能工作在接收模式,并且它具有过温、短路检测功能。芯片采用了......