leetcode刷题14:word break

这道题大概是说给定一个字符串,以及一个字符串的字典(集合),问字符串是不是可以由字典中的字符串组合而成:

一个例子是:字符串s=‘leetcode’,字典d=['leet','code'].这个时候字符串s可以用字典中的字符串组合而成。


观察之后得到的思路是:假设字符串s长度为l,那么这个字符串就有l个前缀,那么遍历这些前缀。

1首先判断字符串当前前缀,是不是在字典中

如果该前缀在字典中,递归判断与该前缀对应的后缀是否可以使用字典组合表示

如果该前缀对应后缀可以使用字典组合表示,则当前字符串可以使用字典组合表示,返回true

                 如果判断为否,continue循环。


2上面循环如果结束,字符串的所有前缀及其对应后缀都不能使用字典中字符串组合而成。返回false。


然而这个算法时间复杂度很高。使用公式表示如下:

f(n)=f(n-1)+f(n-2)...f(1)

数学不好,但可以想象应该是指数级别。


再仔细观察可以看出,使用上面递归方法,某些后缀字符串被大量重复计算。是不是可以首先机选后缀,然后保存起来呢?

所以得到以下方法:

字符串s的后缀集合set(s长度为l,则set秩为l),从最短的后缀开始,顺序遍历集合

使用一个字典tmp_d:某个后缀为key,是否可以由输入字典中字符串组合而成为val,是bool型。

对当前后缀suffix

遍历它的所有前缀:

如果当前前缀在字典中:

当前前缀在suffix中的后缀在tmp_d为真,则tmp_d[suffix]=True

break 循环

                如果循环结束,但是tmp_d中仍然没有suffix,则设其为false。


代码为:

class Solution:
    # @param s, a string
    # @param dict, a set of string
    # @return a boolean
    def wordBreak(self, s, dict_):
        # assume is is not None
        if len(s)== 0:
            if s in dict_:
                return True
            return False


        tmp_result = {}
        for i in xrange(len(s)-1,-1,-1):
            suffix = s[i:]
            for j in xrange(1,len(suffix)+1):
                prefix = suffix[:j]
                if prefix in dict_:
                    # The whole word is in dict_
                    if suffix[j:]=='':
                        tmp_result[suffix]=True
                        break


                    else:
                        result = tmp_result[suffix[j:]]
                        if result:
                            tmp_result[suffix]=True
                            break


            if not suffix in tmp_result:
                tmp_result[suffix] = False


        return tmp_result[s]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值