题目描述

假设所有字符都是小写字母. 长字符串是str
arr是去重的单词表, 每个单词都不是空字符串且可以使用任意次

使用arr中的单词有多少种拼接str的方式,返回方法数.

题目解析

从左到右尝试模型

大思路

实现


// 所有的可分解字符串,都已经放在了set中
// str[i....] 能够被set中的贴纸分解的话,返回分解的方法数
int process(std::string &str, int start,  std::set<std::string> &set){if(start == str.size()){return 1;}int max_len = str.size();//  i....还有字符串需要分解int ways = 0;for (int len = 1; start + len <= max_len; ++len) {auto pre = str.substr(start, len);if(set.count(pre)){ways += process(str, start + len, set);  //去除前缀字符之后, 剩下的字符是否可以被拼接成}}return ways;
}int ways1(std::string str, std::vector<std::string> &words){std::set<std::string> set;for(auto word : words){set.insert(word);}return process(str, 0, set);
}

暴力改动态规划

dp[i]:str从i出发以及其后面所有的字符串被set分解有几种方法

复杂度分析

前缀树优化

  • a … 先匹配,然后依赖 dp[1]
  • aa … 先匹配,然后依赖dp[2]
  • aaa …先匹配,匹配不到

举个例子


原来:

  • 需要检查分别a、aa、aac、aaca、aacab、aacab 在不在set里面
  • 每一个前缀都需要检查

  • 查找a,从根节点开始找,往下蹦一层,就找到了a,说明存在—》可以依赖dp[i+1]
  • 指针下移,指向第二个a,往下蹦一层,又找到了一个a,说明存在aa—》可以依赖dp[i+2]
  • 指针下滑,指向a,找到了aac
  • 指针下滑,指向aaca,没有找到aaca,可以直接返回了

对数器


struct RandomSample{std::string str;std::vector<std::string> words;explicit RandomSample(std::string str, std::vector<std::string> words): str(std::move(str)), words(std::move(words)){}
};std::default_random_engine e;
std::vector<std::string>randomSeeds(std::vector<char> &candidates, int vec_len, int str_len){std::uniform_int_distribution<int> distV(1, vec_len);std::uniform_int_distribution<int> distS(1, str_len);std::uniform_real_distribution<double> genera_str;int size = distS(e);std::vector<std::string> arr(size);for (int i = 0; i < size; ++i) {std::string str(distS(e), ' ');for (int j = 0; j < str.size(); ++j) {str[j] = candidates[genera_str(e) * candidates.size()];}arr[i] = str;}return arr;
}
RandomSample generateRandomSample(std::vector<char>candidates, int vec_len, int str_len, int joint){auto seeds  = randomSeeds(candidates, vec_len, str_len);std::set<std::string> set;for(auto &str : seeds){set.insert(str);}std::vector<std::string> arr(set.size());int idx = 0;for(auto &str : set){arr[idx++] = str;}std::uniform_real_distribution<double> genera_str;std::string all;for (int i = 0; i < joint; ++i) {all += arr[genera_str(e) * arr.size()];}return RandomSample(all, arr);
}int main() {e.seed(time(NULL));std::vector<char> candidates = {'a', 'b'};int vecLen = 20;int strLen = 4;int joint = 5;int testTimes = 1100;int ans1, ans2, ans3, ans4;for (int i = 0; i < testTimes; i++) {RandomSample sample = generateRandomSample(candidates, vecLen, strLen, joint);
//        sample.str = "abb";
//        sample.words = {"abb", "bb"};ans1 = ways1(sample.str, sample.words);ans3 = ways3(sample.str, sample.words);
//        ans4 = ways4(sample.str, sample.words);if (ans1 != ans3) {printf("test error, %d, %d ! %s\n", ans1,  ans3, sample.str.c_str());std::copy(sample.words.begin(), sample.words.end(), std::ostream_iterator<std::string>(std::cout, " "));return 0;}
//        if (ans1 != ans2 || ans3 != ans4 || ans2 != ans4) {//             printf("test error, %d, %d, %d, %d! %s\n", ans1, ans2, ans3, ans4, sample.str.c_str());
//            return 0;
//        }}printf("test finish!\n");return 0;
}

算法:使用单词表拼接字符串的方法数相关推荐

  1. 算法53----换钱的最小次数和方法数【动态规划】

    一.题目:换钱的最小次数 给定数组arr,arr中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数. 举个 ...

  2. java 加单引号_【沫沫金】Java逗号拼接字符串增加单引号

    背景 页面提供逗号拼接的字符串,可作为数据库查询in的条件. a,b 问题 数据库针对字符串的in条件,要求增加单引号 xx in ('a','b') 需求 页面的逗号拼接字符串直接转换成数据库要求格 ...

  3. 算法练习day13——190401(前缀树、贪心策略拼接字符串使字典序最小)

    1.前缀树(Trie Tree) 1.1 字符串生成前缀树的过程 字母是填在路上的,不是填在节点上的. 首先是一个空的头结点: 加入"abc"到这棵树中: 头结点有到a的路吗?没有 ...

  4. python统计单词频率、存放在字典中_Python3实现统计单词表中每个字母出现频率的方法示例...

    本文实例讲述了Python3实现统计单词表中每个字母出现频率的方法.分享给大家供大家参考,具体如下: 作为python字典与数组概念的运用,统计字母表中每个字母出现的频率,作为练习再合适不过. 解决问 ...

  5. c++ 字符串拼接_源码上看 .NET 中 StringBuilder 拼接字符串的实现

    专注分享C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协 ...

  6. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  7. String拼接字符串效率低,你知道原因吗?

    面试官Q1:请问为什么String用"+"拼接字符串效率低下,最好能从JVM角度谈谈吗? 对于这个问题,我们先来看看如下代码: public class StringTest {p ...

  8. 拼接字符串时去掉最后一个多余逗号

    当我们遍历拼接字符串的时候,最后会多出一个我们添加的字符(比如逗号). 方式一: String str[] = { "hello", "beijing", &q ...

  9. 【Flutter】Dart 数据类型 字符串类型 ( 字符串定义 | 字符串拼接 | 字符串 API 调用 )

    文章目录 I . 字符串定义 I . 字符串拼接 III . 字符串 API 调用 IV . 字符串 Demo 示例 I . 字符串定义 使用单引号 ' ' 和 双引号 " " 都 ...

最新文章

  1. indows上的android开发环境软件架构5
  2. jsp java el_jsp之EL表达式
  3. ArcGIS特殊标注效果的简单实现
  4. netcore一键nssm发布为windows服务
  5. ubuntu7.10下的vi用的怪怪的
  6. python数字排列组合去重_排列组合-生成集合的所有子集
  7. (二十)java版spring cloud+spring boot 社交电子商务平台-spring cloud构建全球多租户分布式微服务部署的方案...
  8. 中职计算机多媒体教材,中职汽车维修课中计算机多媒体教学的实施
  9. 【干货】高盛合伙人制度和激励机制!
  10. zabbix开启SNMPTrap功能
  11. 一个java swt桌面程序开发到打包的总结(1)(收集)
  12. C#配置系统未能初始化
  13. 笔记本连不上路由器WiFi,可以连接手机热点,手机可以连接WiFi
  14. 查看mysql中SQL的执行计划
  15. u8显示服务器资源不足,系统提示“虚拟内存不足”的原因及解决方法
  16. 基于 WebGL 的 3D Chart 图表
  17. vue前端video视频截图与录影功能的简单实现
  18. 计算机专业研究生核心能力培养(1)——论文阅读与积累
  19. AppNode受控端命令 - AppNode帮助中心
  20. 浪潮服务器bios怎么找回密码,服务器BIOS密码丢失解决方法

热门文章

  1. kcp 介绍与源代码分析_kcp介绍
  2. 大气快速辐射传输模型RTTOV12.2安装教程及心得体会
  3. 2017-2018年度刷题记录
  4. 一个小程序入门matlab
  5. HTML5期末大作业:咖啡文食网站设计——代码质量好-咖啡文食品网5页面模板化(1页) HTML+CSS+JavaScript
  6. 一元试用虚拟服务器,一元试用云服务器
  7. 【QT信号和槽】学了C++不学QT就太亏了
  8. 面试回答,JVM内存模型/内存空间:运行时数据区
  9. 如何选择适合你的兴趣爱好(三十三),国画
  10. This version of the JDBC driver is only compatible with Elasticsearch version 7.9 or newer; attempti