LeetCode.139. Word Break

https://leetcode.com/problems/word-break/

哈哈這道題我覺得還是有點難度的,沒想到寫完代碼直接過,還超過了99%。當時就脫口而出WTF!爽到

說說我的思路。

我們要判斷一堆詞是否可以組成字符串s。那麼這個大問題,組成字符串s,可以被考慮成更小的一個問題,組成字符串s的一部分,因爲字符串是前往後匹配的,所以我們要匹配字符串s[0, end],那麼如果第一個單詞匹配上了,我們需要去匹配s[start, end]是否是OK的,如果曾經就計算過start, end是否匹配就好了,就不需要再計算了。

所以理一下,應該是拿着word字典挨個的比對,然後找到1個就遞歸進去,讓start += word.length(),這樣遞歸進去的方法,就是判斷它的子串是否可以匹配。

所以我們要存儲一下第start個字符,到最後是否能被匹配。

對於某個迭代,start = x,必須能從x找到一個匹配的字符串,並且遞歸進去,遞歸的返回結果也必須是true,纔算匹配成功。

那麼所有的思路整合到一起,就是下面的代碼。

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Boolean[] mem = new Boolean[s.length() + 1];
        
        return helper(s, 0, wordDict, mem);
    }
    
    public boolean helper(String s, int start, List<String> wordDict, Boolean[] mem) {
        
        if (start == s.length()) {
            return true;
        }
        
        if (mem[start] != null) {
            return mem[start];
        } else {
            mem[start] = false;
            for (String key : wordDict) {
                if (s.substring(start).startsWith(key)) {
                    mem[start] = helper(s, start + key.length(), wordDict, mem);
                    if (mem[start]) {
                        return mem[start];
                    }
                }
            }
            
            return mem[start];
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章