我是靠谱客的博主 爱笑钥匙,最近开发中收集的这篇文章主要介绍【leetcode】字符串分割,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s ="leetcode",dict =["leet", "code"]. Return true because"leetcode"can be segmented as"leet code".

英语要是不大好,似乎题目都读不懂了。。。
给定一个字符串和一个词典dict,确定s是否可以根据词典中的词分成 一个或多个单词。比如,给定 s = “leetcode” dict = [“leet”, “code”] 返回true,因为"leetcode"可以被分成"leet code"。

思路:
按照动态规划算法的思路,先找状态F(i):前i个字符能否被分割。
递推公式:F(i) = F(j) && substr[j+1,i](j<i)能在字典中找到。什么意思呢,就是在j<i中,只要能找到一个F(j)为true,并且从j+1到i之间的字符能在词典中找到,则F(i)为true。
初始状态为:F(0) = true
返回结果:F(n)
用题中的例子来说:
F(1):"" && “l” —> false
F(2):"" && “le”,“l” && “e” —> false
F(3):"" && “lee”,“l” && “ee”,“le” && “e” —> false
F(4): j=0,"" && “leet” —> true
   j=1,“l” && “eet” —> false
   j=2,“le” && “et” —> false
   j=3,“lee” && “t” —> false

以此类推,新建一个数组保存中间F(i)的值,外层循环控制F(i),内层循环控制[0~i)分割的结果。
具体代码如下:

public class ZiFuChuanFenGe {
    public boolean wordBreak(String s, Set<String> dict) {
        if (s.length() <= 0) {
            return false;
        }
        if (dict.isEmpty()) {
            return false;
        }
        boolean[] arr = new boolean[s.length() + 1];
        //初始化F(0)为true
        arr[0] = true;
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i; j++) {
                if (arr[j] && dict.contains(s.substring(j, i))) {
                    arr[i] = true;
                    break;
                }
            }
        }
        return arr[s.length()];
    }
}

最后

以上就是爱笑钥匙为你收集整理的【leetcode】字符串分割的全部内容,希望文章能够帮你解决【leetcode】字符串分割所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部