LintCode: Word Break

简介:

给定字符串序列和一个字典,问给定的字符串能否用字典中的单词拼出来?

图:

  节点:字符串的前缀长度

  边:前缀x如果加一个字典里边的单词能形成新前缀x',则有一条边

    例如:字符串IAMxxxxx,字典里有I和AM

    则有(0,1)一条边,(1,3)一条边

解:从(0,?)到(?,n)找一条路径

这是一个判断是否有解的问题

BFS/DFS

  从当前前缀开始加一个单词

其他

  能否dp?bool dp[x]表示能否连到x位置

  dp[x] = dp[y] && (y..x是一个单词)

思考:

  如何求一组解?全部解?

C++ 

DFS

(lintcode: s太长的话,会溢出。64bit mac OS上字符串长度超过8881就溢出。)

(leetcode: Accepted)

复制代码
 1 class Solution {
 2 public:
 3     bool help(string &s, int now, unordered_set<string> &d, vector<bool> &have) {
 4         if (now >= s.length()) {
 5             return true;
 6         }
 7         if (have[now]) {
 8             return false;
 9         }
10         have[now] = true;
11         for (int i = now; i < s.length(); ++i) {
12             if ((d.find(s.substr(now, i - now + 1)) != d.end()) && (help(s, i + 1, d, have))) {
13                 return true;
14             }
15         }
16         return false;
17     }
18     /**
19      * @param s: A string s
20      * @param dict: A dictionary of words dict
21      */
22     bool wordBreak(string s, unordered_set<string> &dict) {
23         // write your code here
24         vector<bool> have(s.length(), false);
25         return help(s, 0, dict, have);
26     }
27 };
复制代码

C++

BFS

(lintcode:字符串太长,例如超过10000个字符,会超时)

(leetcode: Accepted)

复制代码
 1 class Solution {
 2 public:
 3     bool help(string &s, unordered_set<string> &d) {
 4         if (0 == s.length()) {
 5             return true;
 6         }
 7         vector<bool> have(s.length(), false);
 8         have[0] = true;
 9         queue<int> q;
10         for (q.push(0); !q.empty(); q.pop()) {
11             int now = q.front();
12             for (int i = now; i < s.length(); ++i) {
13                 if ((d.find(s.substr(now, i - now + 1)) != d.end())) {
14                     if (i + 1 >= s.length()) {
15                         return true;
16                     }
17                     if (!have[i + 1]) {
18                         have[i + 1] = true;
19                         q.push(i + 1);
20                     }
21                 }
22             }
23         }
24         
25         return false;
26     }
27     /**
28      * @param s: A string s
29      * @param dict: A dictionary of words dict
30      */
31     bool wordBreak(string s, unordered_set<string> &dict) {
32         // write your code here
33         return help(s, dict);
34     }
35 };
复制代码

C++

DP

(lintcode:字符串太长,例如超过10000个字符,会超时)

(leetcode: Accepted)

复制代码
 1 class Solution {
 2 public:
 3     bool help(string &s, unordered_set<string> &d) {
 4         if (0 == s.length()) {
 5             return true;
 6         }
 7         vector<bool> dp(s.length(), false);
 8         dp[0] = true;
 9         for (int now = 0; now < s.length(); ++now) {
10             if (!dp[now]) {
11                 continue;
12             }
13             for (int i = now; i < s.length(); ++i) {
14                 if ((d.find(s.substr(now, i - now + 1)) != d.end())) {
15                     if (i + 1 >= s.length()) {
16                         return true;
17                     }
18                     dp[i + 1] = true;
19                 }
20             }
21         }
22         
23         return false;
24     }
25     /**
26      * @param s: A string s
27      * @param dict: A dictionary of words dict
28      */
29     bool wordBreak(string s, unordered_set<string> &dict) {
30         // write your code here
31         return help(s, dict);
32     }
33 };
复制代码

 Python

DP

复制代码
 1 class Solution:
 2     # @param s: A string s
 3     # @param dict: A dictionary of words dict
 4     def wordBreak(self, s, dict):
 5         if len(dict) == 0:
 6             return len(s) == 0
 7             
 8         n = len(s)
 9         f = [False] * (n + 1)
10         f[0] = True
11         
12         maxLength = max([len(w) for w in dict])
13         for i in xrange(1, n + 1):
14             for j in range(1, min(i, maxLength) + 1):
15                 if not f[i - j]:
16                     continue
17                 if s[i - j:i] in dict:
18                     f[i] = True
19                     break
20         
21         return f[n]
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5012413.html,如需转载请自行联系原作者

相关文章
|
程序员 Android开发 开发者
Aab(Android App Bundle)测试与安装
Aab(Android App Bundle)测试与安装
1469 0
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
VS中出现的printf,scanf等函数不安全而报错的问题的全面解决方法
1648 0
|
12月前
|
SQL 缓存 PHP
PHP框架详解 - symfony框架
Symfony框架凭借其灵活性、高性能和强大的社区支持,成为PHP开发领域的重要工具。无论是初学者还是资深开发者,都可以通过Symfony快速构建高质量的Web应用程序。通过深入理解Symfony的核心组件和最佳实践,开发者可以充分发挥其优势,提升开发效率和代码质量。
260 24
|
弹性计算 固态存储 Linux
阿里云服务器、轻量应用服务器、gpu云服务器收费标准与实时活动价格参考
云服务器ECS、轻量应用服务器和gpu云服务器是阿里云的主要云服务器产品,目前轻量应用服务器2核2G收费标准为60元/月,活动价格只要36元/1年或68元1年,云服务器1核1G包月收费标准最低为24.0元/月,GPU云服务器中gn6i实例4核15G配置月付1681.00/1个月起,gn6v实例8核32G配置月付3817.00/1个月起。本文为大家整理汇总了阿里云服务器、轻量应用服务器、gpu云服务器的最新收费标准与活动价格情况,以表格形式展示给大家,以供参考。
|
机器学习/深度学习 人工智能 人机交互
ICML 2024:AI也会刷抖音!清华领衔发布短视频全模态理解新模型
【8月更文挑战第20天】SALMONN是由清华大学在ICML 2024发表的一种开创性的多模态模型,专为短视频全模态理解设计。它集成了预训练文本大模型与语音、音频编码器,能直接处理多样音频输入,在自动语音识别、翻译、情绪识别等任务中表现出色。SALMONN展现了令人兴奋的新能力,如翻译未训练语言和基于语音的问答。通过少样本激活微调,可进一步发掘其跨模态潜能。尽管如此,模型的计算成本和泛化能力仍是待克服的挑战。SALMONN标志着AI在具备通用听觉理解方面迈出重要一步。[论文链接: https://arxiv.org/abs/2310.13289]
468 3
量化交易系列【5】:如何快速的将日K线数据转换为周K线及月K线数据,神奇的resample函数
量化交易系列【5】:如何快速的将日K线数据转换为周K线及月K线数据,神奇的resample函数
量化交易系列【5】:如何快速的将日K线数据转换为周K线及月K线数据,神奇的resample函数
|
安全 程序员 网络安全
网络安全那些梗
网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗
547 4
|
数据采集 数据库连接 API
直连同步的优缺点
【6月更文挑战第19天】直连同步的优缺点
493 6
|
负载均衡 监控 Cloud Native
FinOps
“【5月更文挑战第25天】”
502 5