• [leetcode]Word Break


    网上查了下,好像可以用DP做...

    但是我这种DP弱...感觉只要是DP就做不来TAT(等下再看看DP的题解

    其实这个可以用Trie做.

    把dict的词全部建立一颗Trie

    然后呢,从给定的字符串开始走。。。

    遍历一下Trie,如果遇到isWord,就说明这个前缀在dict里面啦。

    那么在这个位置做个标记。

    然后扫描这些做了标记的位置(肯定是在后面啦。。。从前往后就ok了。。。

    继续从下一个字符开始作为起点,做如上处理。

    如果最后s.size()-1这个位置也是结尾的字符,那么就说明这个是ok的!返回true

    class TrieNode{
        public:
            TrieNode* childs[26];
            bool isWord;
    
            TrieNode():isWord(false){
                for(int i = 0 ; i < 26 ; i++)
                    childs[i] = nullptr;
            }
            void insert(const string& str){
                int size = str.size();
                TrieNode* curr = this;
                for(int i = 0 ; i < size ; i++){
                    if(curr -> childs[str[i] - 'a'] == nullptr){
                        curr -> childs[str[i] - 'a'] = new TrieNode();
                    }else{
                        //do nothing                    
                    }
                    curr = curr -> childs[str[i] - 'a'];
                }
                curr -> isWord = true;
            }
            ~TrieNode(){
                for(int i = 0 ;i < 26 ; i++)
                    delete childs[i];
            }
    };
    class Solution {
    public:
        bool wordBreak(string s, unordered_set<string> &dict) {
            TrieNode* root = new TrieNode();
            for(auto i = dict.begin() ; i != dict.end() ; i++){
                root -> insert(*i);
            }
            
            vector<bool> v(s.size() , false);
            findMatch(s , root , 0 , v);
            
            int size = s.size();
            for(int i = 0 ; i < size ; i++)
                if(v[i]) findMatch(s , root , i + 1 , v);
            return v[size - 1];
        }
        void findMatch(const string& str , TrieNode* root , int start , vector<bool>& v){
            int size = str.size();
            TrieNode* curr = root;
            for(int i = start ; i < size ; i++){
                if(curr -> childs[str[i] - 'a'] != nullptr){
                    curr = curr -> childs[str[i] - 'a'];
                    if(curr -> isWord){
                        v[i] = true;
                    }
                }else{
                    break;
                }
            }
        }
    };
  • 相关阅读:
    实现对DataGird控件的绑定操作
    EasyUI-datagrid中load,reload,loadData方法的区别
    easui Pagination Layout
    easyUI datagrid 排序
    jQuery EasyUI教程之datagrid应用
    solr入门之多线程操作solr中索引字段的解决
    序列自相关矩阵的计算和分析
    UVa 12403
    滑动窗体的最大值(STL的应用+剑指offer)
    bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
  • 原文地址:https://www.cnblogs.com/x1957/p/3492926.html
Copyright © 2020-2023  润新知