Leetcode------139. 单词拆分

本文介绍如何使用字典树(Trie)解决单词拆分问题,通过构建字典树快速查找字符串是否能由字典中的单词组成。文章详细展示了字典树节点结构、插入、搜索和前缀检查等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个非空字符串 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

 

 

-------------------------------------------------------------------------------------------------------------------------------------------

单词组合问题,可以用字典树写,最近刚刚了解了字典树,字典树可真是个好东西。

  字典树对于字符的查找确实很好,而且写起来也不难。

AC:

struct TrieNode
    {
        bool isword;    //作用是用于标记一个单词的结尾,有点像链表的封尾。
        TrieNode* child[26];     //代表26字母。
        TrieNode()
        {
               isword=false;
               memset(child,NULL,sizeof(child));
        }
    };
class Trie {
public:
    /** Initialize your data structure here. */

    Trie() {
         root=new TrieNode();
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
        TrieNode *r=root;
        for (int i=0;i<word.length();i++)
        {
            if (r->child[word[i]-'a']==NULL)
            {
                r->child[word[i]-'a']=new TrieNode();
            }
            r=r->child[word[i]-'a'];
        }
        r->isword=true;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        TrieNode* r=root;
        for (int i=0;i<word.length();i++)
        {
            if (r->child[word[i]-'a']==NULL)
            {
                return false;
            }
             r=r->child[word[i]-'a'];
        }
        return (r->isword);
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        TrieNode* r=root;
        for (int i=0;i<prefix.length();i++)
        {
            if (r->child[prefix[i]-'a']==NULL)
            {
                return false;
            }
             r=r->child[prefix[i]-'a'];
        }
        return true;
    }
    private:
    TrieNode* root;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值