leetcode刷题15:word break 2

和上一题一样,可以遍历输入字符串的所有后缀,从最小的后缀开始,并且记录该后缀

的所有合法“分词”(例如:‘leetcode’可以被分为‘leet code’,并且leet 和code在给定字典['leet','code']中都是合法单词,那么这是一个valid分词)

具体算法和14题大体一致:

使用一个字典保存中间记录tmp

遍历所有后缀,按照长度,从最小后缀开始遍历:

对当前后缀suffix,遍历其前缀集合,按照长度顺序遍历:

如果当前前缀是给定字典中合法单词,

如果该前缀对应后缀为空,即已经到了当前suffix末尾,tmp字典中加入[前缀]

如果不为空,找出之前tmp字典中的记录result=tmp[前缀对应后缀],将前缀依次插入result的各个item中。

算法循环结束后,tmp[s]即是所求。

代码如下:

class Solution:
    # @param s,a string
    # @param dict, a set of string
    # @return a boolean
    


    def wordBreak(self,s,dict_):
        import copy
        # assume is is not None
        if len(s)== 0:
            if s in dict_:
                return True
            return False


        def copy(l):
            ret = []
            for item in l:
                tmp=[]
                for i in item:
                    tmp.append(i)
                ret.append(tmp)
            return ret




        tmp_result = {}
        for i in xrange(len(s)-1,-1,-1):
            suffix = s[i:]
            tmp_result[suffix]=[]


            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].append([prefix])


                    else:
                        result = tmp_result[suffix[j:]]
                        result = copy.deepcopy(result)


                        map(lambda x:x.insert(0,prefix),result)
                        
                        tmp_result[suffix].extend(result)
                        


        return map(lambda x:' '.join(x),tmp_result[s])
                            
                            


def test_solution():
    ss = Solution()
    s='aaaaaaa'
    d = ['aaaa','aaa']
    set_ = set(d)
    print ss.wordBreak(s,d)
    
if __name__ == '__main__':
    test_solution()
    

注意这里自定义了copy函数,因为tmp_result中保存的是引用,所以更新tmp的内容的时候,不同key的值之间会有干扰,也可以使用copy模块。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值