字节测开三面算法题(求解)

给出一个字符串 s 和一个词表 wordDict,按照词表对字符串进行切分,排除干扰元素,返回一个子串数组,要求切割后的子串尽可能地覆盖原字符串。

示例 1:
输入:
s = "hecatsanddogllo"
wordDict = ["cat", "cats", "and", "sand", "dog"]
输出:
["cats and dog"]
["cat sand dog"]
任意一个都可。

示例 2:
输入:
s = "hcatsandog"
wordDict = ["cats", "sandog"]
输出:
["sandog"]

示例 3:
输入:
s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出:
["cats", "and"]
["cats", "dog"]
["cat", "sand"]
任意一个都可。
public List<String> wordBreak(String s, Set<String> wordDict) {
    
}

感谢室友提供的答案:   (动态规划还是难啊)
/**
 * dp[i]:表示s中前i个字符最大可以切割的子字符串数组的长度和
 * result[i]存储的 List<String>为: s中前i个字符最大可以切割的子字符串数组
 * 举个例子:s = "catsandog",    wordDict = ["cats", "dog", "sand", "and", "cat"]
 * 因为 ca 没有出现在 wordDict 中,因此 对于s中的前 0/1/2 个字符来说,
 * dp[0]==dp[1]==dp[2]==0     result[0]==result[1]==result[2]==new ArrayList<>()
 * 当i为3时,cat符合条件,因此 dp[3] = 3     result[3] = ["cat"]
 * 当i为4时,cats符合条件,因此 dp[4] = 4     result[4] = ["cats"]
 * 当i为5时,以s中第5个字符'a'为结尾的子字符串没有存在词表里,因此 dp[5] = dp[4]  result[5] = result[4] = ["cats"]
 * 同理   dp[6] = dp[5]     result[6] = result[5] = ["cats"]
 * 当i为7时,s 中 第 4个字符到第7个字符 组成的 子字符串  sand 存在于 词典里,
 * 因此 dp[7] = Math.max(dp[6], dp[4-1] + 7 - 4 + 1)  而 result[7] 也会根据dp[7]的选择,
 * 如果 dp[7] == dp[6] 那么 result[7] = result[6] = ["cats"]
 * 否则的话,result[7] = result[4-1] + s中第4个字符到第7个字符组成的子字符串 = ["cat", "sand"]
 * 后面的依次类推,最后返回 result[i] 中最后一个 List<String> 即为所求。
 */

public static List<String> wordBreak(String s, Set<String> wordDict) {
    int length = s.length();
    int[] dp = new int[length + 1];
    List<String>[] result = new ArrayList[length + 1];
    result[0] = new ArrayList<>();
    dp[0] = 0;
    for (int right = 1; right <= length; ++right) {
        int index = -1;
        int maxLen = 0;
        for (int left = 1; left <= right; ++left) {
            if (wordDict.contains(s.substring(left - 1, right))) {
                int currentLen = right - left + 1 + dp[left - 1];
                if (maxLen < currentLen) {
                    maxLen = currentLen;
                    index = left;
                }
            }
        }
        List<String> currentList;
        if (index == -1 || maxLen < dp[right - 1]) {
            dp[right] = dp[right - 1];
            currentList = new ArrayList<>(result[right - 1]);
        } else {
            dp[right] = maxLen;
            currentList = new ArrayList<>(result[index - 1]);
            currentList.add(s.substring(index - 1, right));
        }
        result[right] = currentList;
    }
    return result[length];
}







#字节跳动内推提前批##面经##校招##字节跳动##测试开发工程师#
全部评论
这个题解没看懂啊
点赞 回复 分享
发布于 2021-08-10 09:30
测开考这么难的题么
点赞 回复 分享
发布于 2021-08-04 21:00
楼主哪个部门啊
点赞 回复 分享
发布于 2021-08-04 15:12
LeetCode140
点赞 回复 分享
发布于 2021-08-03 16:13

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
2
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务