c# leetcode 139. 單詞拆分(動態規劃)

139. 單詞拆分難度中等367收藏分享切換爲英文關注反饋給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict,判定 s 是否可以被空格拆分爲一個或多個在字典中出現的單詞。

說明:

拆分時可以重複使用字典中的單詞。 你可以假設字典中沒有重複的單詞。

示例 1:

輸入: s = "leetcode", wordDict = ["leet", "code"]
輸出: true
解釋: 返回 true 因爲 "leetcode" 可以被拆分成 "leet code"

示例 2:

輸入: s = "applepenapple", wordDict = ["apple", "pen"]
輸出: true
解釋: 返回 true 因爲 "applepenapple" 可以被拆分成 "apple pen apple"。
     注意你可以重複使用字典中的單詞。 

示例 3:

輸入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
輸出: false

解析:

用到了一個小的技巧,創建一個bool數組,第一個指定爲 true

true,false,false,false,false,true,false,false,true,false,false,false,false,true

截取從true,到true  的包含纔算有效,然後將當前的標記爲true

返回最後一個true證明剛好結束

 動態規劃:

        public static bool WordBreak(string s, IList<string> wordDict)
        {
            int len = s.Length;
            bool[] f = new bool[len + 1];
            f[0] = true;
            for (int i = 1; i < len + 1; i++)
                for (int j = 0; j < i; j++)
                    if (f[j] && wordDict.Contains(s.Substring(j, i - j)))
                    {
                        f[i] = true;
                        break;
                    }
            return f[len];
        }

調用: 

        static void Main(string[] args)
        {
            List<string> s = new List<string>() { "apple","pen","apple" };
            Console.Write(WordBreak("applepenapple", s));
            Console.ReadKey(); 
        } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章