lintcode 題目記錄3

巴扎黑
發布: 2017-06-23 15:49:04
原創
1811 人瀏覽過

Expression Expand  Word Break II Partition Equal Subset Sum

 Expression Expand 

#字串展開問題,依照[]前的數字展開字串,主要是維護兩個棧一個是展開個數棧一個是展開內容棧,內容棧添加[用來判斷是否把要展開的內容全部推出,然後要注意數字可能不止一位其他就無所謂了

class Solution:# @param {string} s  an expression includes numbers, letters and brackets# @return {string} a stringdef expressionExpand(self, s):# Write your code herenl=[]
        sl=[]
        sc=''res=''lstr=''for i in s:if i.isdigit():if not lstr.isdigit():
                    sl.append(sc)
                    sc=''sc = sc + ielse:if i=='[':
                    nl.append(int(sc))
                    sc = ''sl.append('[')elif i==']':
                    n=nl.pop()while len(sl)>0:
                        k=sl.pop()if k== '[':breaksc = k+ sc
                    ts=''for j in range(n):ts= ts + sc
                    sc=''if len(nl) > 0:sl.append(ts)else:
                        res = res + tselse:if len(nl)>0:
                        sc = sc + ielse:
                        res = res + i
            lstr=ireturn res
登入後複製

 Word Break II  

單字切分問題,在陣列重從開頭的字串開始查找,找到了就加入棧,然後每次循環pop  判斷pop出的字串是否完整,完整加入結果,不完整找後續,能找到後續加入棧,沒有繼續下一次循環,這裡又一定歧義,wordDict裡邊的字符串是否可以重複使用的問題?

這玩意當字串很長後邊的字典數組很多的時候會很慢,暫時沒想到什麼優化的演算法,lintcode給的測試資料裡邊好像沒有這種情況只有一個特殊情況,所以前邊加了一個濾波算通過了,還有要注意python的startwith函數 

如果參數是''總是回傳True略坑爹····

class Solution:# @param {string} s a string# @param {set[str]} wordDict a set of wordsdef wordBreak(self, s, wordDict):# Write your code herehead=[]
        ss=''for i in s:if ss=='':
                ss=ielse:if i not in ss:
                    ss = ss + ifor i in ss:
            flag=Falsefor di in wordDict:if i in di:
                    flag=Truebreak;if not flag:return []for di in wordDict:if di !='' and  s.startswith(di):
                head.append(di)if len(head)<1:return []
        cur=s
        res=[]while len(head)>0:
            h=head.pop()
            le=len(h.replace(' ',''))
            cur=s[le:]if cur == '': 
                res.append(h)continuefor di in wordDict:if cur.startswith(di):
                    head.append(h+' '+di)                    return res
登入後複製

#Partition Equal Subset Sum

數組分組求和問題,題目說條件很多數字都是整數不超過100 數組長度不超過200,就是讓用動態規劃來做,就是背包問題的簡化版,先求所有數字的和,為偶數才能分成兩組,否則直接返回false,然後除以2求最終要分組的和,這個值就類似背包問題的容量,數組中的數字就類似要裝進背包的東西,不同於背包問題的是背包問題要遍歷到最後一個格子,這裡只有又格子值與這個和相等就行了,不一定要遍歷到最後一個格子

class Solution:# @param {int[]} nums a non-empty array only positive integers# @return {boolean} return true if can partition or falsedef canPartition(self, nums):# Write your code heresum=0for n in nums:
            sum = sum +nif sum%2!=0:return False
        k=sum//2a=[None]*len(nums)for i in range(len(nums)):
            a[i]=[0]*k            for i in range(len(nums)):for j in range(k):if i == 0:
                    a[i][j] = nums[i] if nums[i] < j+1 else 0else:if nums[i]> j+1:
                        a[i][j]=a[i-1][j]else:
                        a[i][j]=max(nums[i]+a[i-1][j+1-nums[i]],a[i-1][j])                        if a[i][j] ==k:return Truereturn False
登入後複製

 

##

以上是lintcode 題目記錄3的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板