首页 » 编程之美 » 正文

[leetcode_139]Word Break

给定字典,判断输入单词是否可以拆分为字典中的单词。
暴力+剪枝。
开始超时,额外地判定,当前的字符是否都在字典中存在即可。但是我感觉钻了测试数据的空子。

class Solution {
public:
    bool result;
    bool letters[26];
    bool wordBreak(string s, unordered_set<string> &dict) {
        result = false;
        for(int i = 0;i < 26;i++)
            letters[i] = false;
        for(string it:dict) {
            for(int i = 0;i < it.length();i++) {
                letters[it[i] - 'a'] = true;
            }
        }
        for(int  i = s.length();i > 0;i--) {
            if(existLetters(string(s,0,i)) == false)return false;
            if(dict.find(string(s,0,i)) != dict.end()) {
                if(i == s.length())return true;
                else {
                    wordBreakStep(s,i,dict);
                }
            }
        }
        return result;
    }
private:
    bool existLetters(string s) {
        for(int i = 0;i < s.length();i++) {
            if(letters[s[i] - 'a'] == false)return false;
        }
        return true;
    }
    void wordBreakStep(string s,int start,unordered_set<string> &dict) {
        if(result == true)return;
        for(int i = s.length() - start;i > 0;i--) {
            if(existLetters(string(s,start,i)) == false)return;
            if(dict.find(string(s,start,i)) != dict.end()) {
                if(i == s.length()-start) {
                    result = true;
                    return;
                }
                else {
                    wordBreakStep(s,start + i,dict);
                }
            }
        }
    }
};

发表评论